题目链接:
题目描述:
解题思路:
按照题目中要求,必须在原来数组中进行修改,并且在O(1)额外空间条件下完成。因此我们可以使用双指针算法,算法具体流程如下:
- 如果数组长度
nums.size() <= 2
, 则直接return nums.size()
即可 - 定义两个指针
slow
和fast
,并初始化为2 - 如果
nums[slow - 2] == nums[fast]
,说明已经有两个数相等,因此nums[fast]
数值不能放进结果之中。反之,如果nums[slow - 2] != nums[fast]
,那么nums[fast]
可以放进nums[slow]
中,并且slow++
,记录结果的长度 - 当
fast>=nums.size()
的时候,结束循环,返回数组长度slow
复杂度分析:
时间复杂度O(n)
空间复杂度O(1)
代码实现:
cpp
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if(n<=2){
return n;
}
int slow = 2;
int fast = 2;
while(fast<n){
if(nums[slow-2] != nums[fast]){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
};
进一步可以优化掉快指针fast:
cpp
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int slow = 0;
for(int num : nums){
if(slow<2 || nums[slow-2] < num){
nums[slow] = num;
slow++;
}
}
return slow;
}
};