题目描述
方法一:快慢指针
思路:
- 使用 k 记录当前不重复元素应放的位置,并初始化为1;
- 判断数组 nums 是否为空,如果为空,则直接返回0;如果不为空,第一个元素一定不与前面的元素重复,这也是 k 初始化为1的原因;
- 遍历数组 nums,如果 nums[i] 一直与前面的元素重复,则 ++i 跳过,使用 while 循环实现该过程,当 while 循环结束时,若数组没有遍历完,则碰到了一个不与前面元素相同的值,放入nums[k] 中,++k。
代码实现:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int k = 1;
if (nums.size() == 0) {
return 0;
}
for (int i = 1; i < nums.size(); ++i) {
while (i < nums.size() && nums[i] == nums[i - 1])
++i;
if (i < nums.size())
nums[k++] = nums[i];
}
return k;
}
};
优化:
看了官方给的答案,里面使用了快慢指针,其实现更为简洁、高效,实现方式如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int k = 0; // 慢指针
if (nums.size() == 0) {
return 0;
}
for (int i = 1; i < nums.size(); ++i) { // i 为快指针
if (nums[i] != nums[k]) {
nums[++k] = nums[i];
}
}
return k + 1;
}
};