题目
题目
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
算法分析
才用“双指针”的方法解决这个题,具体过程如下:
1. 刚开始的时候,指针i只想数组下标为1的位置,指针k指向数组下标为0的位置。所以nums[k]==nums[0],nums[i]=nums[1]。
2. 判断i指向的值与k指向的值是否一样,如果一样,说明二者重复,不作处理。i继续移动到下一个位置与k指向的位置的值进行判断。
3. 经过判断,i指向的值与k指向的值不一样,则k++,将k移动到下一个位置,然后将此时i指向的值赋值给k指向的位置。
4. 继续判断i指向的值与k指向的值,经过三次比较后,i指向的值都与k指向的值一样,不作处理。等i第一次指向的值为2的时候,i指向的值与k指向的值不一样,那么,k++,将k移动到下一个位置,然后将此时i指向的值赋值给k指向的位置。
5. 等i第二次指向的值为2的时候,与k指向的位置的值一样,不作处理,i继续向下移动一位。此时,i指向3,k指向2。二者的值不一样,那么,k++,将k移动到下一个位置,然后将此时i指向的值赋值给k指向的位置。
6. 以此类推。最后,k的值为4(是变量k本身的值,不是k指向的数组的位置的值,这里正好k指向的数组的那个位置是4,只是巧了)。从数组的第一个节点到k指向的节点就是最终的想要的那个结果
7. 返回数组中不同的值的个数,返回从数组的第一个节点到k指向的节点的个数即可,因为k是从0开始的,所以返回k+1就是正确的结果
代码
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int len=nums.size();//求数组长度
int k=0;
for(int i=1;i<len;i++){
if(nums[k]!=nums[i]){
k++;
nums[k]=nums[i];
}
}
return k+1;
}
};