赞
踩
毋庸置疑只有一个指针!!!
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素
示例 1:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2
, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,3,0,4]
解释:函数应该返回新的长度 5
, 并且 nums 中的前五个元素为 0
, 1
, 3
, 0
, 4
。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
思路:遍历数组找到需要被删除的元素,然后后位补齐,得到新的数组及新数组的长度;
(这个时候肯定会有小伙伴想把那个直接删掉不就好了吗???但是肯定和我当时最开始一样没有注意到数组中地址连续,不能单独删除某个元素,只能覆盖。。。。。)所以这样是行不通的,所以要另辟捷径。
题解开始:
话不多说,可以使用一个指针指向新数组的位置,遍历原数组,将不等于val的元素放入新数组,并且在放入一个新元素指针就后移一位,最后修改新数组的大小
代码如下:
- #pragma once
- #include <vector>
- #include<algorithm>
- using namespace std;
- class Solution1
- {
- public:
- int removeElement(vector<int>& nums, int val)
- {
- int size=nums.size();
- int flag=0;
- for(int i=0;i<size;i++)
- {
- if(nums[i]!=val)
- {
- nums[flag]=nums[i];
- flag++;
- }
- }
- nums.resize(flag);
- return nums.size();
- }
-
- };
但是一开始我在想怎么指针还能一快一慢,这又不是赛跑,还能这样玩???
但是事实就是真的可以这样玩,它还就真的可以赛跑一样;下面和我一起看看它是怎么跑的吧!!!
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
nums
,使 nums
的前 k
个元素包含唯一元素,并按照它们最初在 nums
中出现的顺序排列。nums
的其余元素与 nums
的大小不重要。k
。示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2
,并且原数组 nums 的前两个元素被修改为 1
, 2
不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5
, 并且原数组 nums 的前五个元素被修改为 0
, 1
, 2
, 3
, 4
。不需要考虑数组中超出新长度后面的元素。s
思路:遍历去重,留下唯一,返回新数组长度
(是不是感觉很简单,distinct一下不就好了吗???,停停停,走错片场了!!!小拳拳警告哦,数据库可以这样,但是这里不行哦)
废话不说,上题解:
安排两个指针(一个兔子(fast),一个乌龟(slow)),比赛开始,兔子直接从1出发,乌龟从0,出发,然后兔子等于乌龟的值,兔子向前跑,乌龟不动,当兔子值与乌龟不同时候乌龟感觉到危机,向前挪动一步,然后以此类推,一直向下,找出所有值,并且每个值只拿出一次,给乌龟。此时乌龟有了整个数组里的所有不同的值,并且每个值独一无二,兔子则是跑完整个数组探路。
代码如下:
- #pragma once
- #include<vector>
- #include<iostream>
- using namespace std;
- class Solution2
- {
- public:
- int removeDuplicates(vector<int>& nums) {
- int size=nums.size();
- int fast=1,slow=0;
- if(size==0)
- {
- return 0;
- }
- for(fast=1;fast<size;fast++)
- {
- if(nums[fast]!=nums[slow])
- {
- nums[slow+1]=nums[fast];
- slow++;
- }
-
- }
- return slow;
- }
- };
要有不对地方还请多多包含,欢迎各位大佬及时指正,我也刚刚开始接触算法没几天,需要学习的还很多~~~~
今日总结到此结束~~~~拜拜咯~~~~
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。