海上生明月,天涯共此时。

题目描述:

删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k

解题代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int first = 1;
int second = 1;
for(first;first < nums.size();first++){
if(nums[first] != nums[second - 1]){
nums[second] = nums[first];
second++;
}
}
return second + 1;
}
};

image-20230929214547282

解读与收获:

本题运用了快慢指针,代码中first为快指针,second为慢指针,循环开始时,快慢指针同时指向数组中第二个元素,在之后的循环中,若快指针和慢指针后一位不相等,则快慢指针一起后移,若相等,则 慢指针原地不动,作为替换位,快指针继续后移,直到找到不等于慢指针后一位元素的数,这时将慢指针本身指向的数替换为快指针的值,完成去重。