(力扣)80. 删除有序数组中的重复项 II
class Solution {
public:int removeDuplicates(vector<int>& nums) {if(nums.size()<=2){return nums.size();}int slow=2,fast = 2;while(fast<nums.size()){if(nums[fast]==nums[slow-2]){fast++;}else{nums[slow]=nums[fast];slow++;fast++;}}return slow;}
};
本题o(1)是典型的双指针问题。如果是其他的去重也有很多办法比如集合(set),hash计算每种的个数并且重新生成一个符合规定的数组。
其中双指针我认为是比较高效的一种。
slow指针指向已经保存好的数组的下一个位置,也就是下一个合法元素正确的位置。
fast指向待检查元素。 因此slow和fast都初始化为2。是因为前两个不用检查,如果不同那么就都是合法的,如果相同也是合法的。
当nums[fast] == nums[low-2]时,也就是fast此时的元素不用移动fast++
当不等时,也就是有合法元素,插入到slow位置,并且slow和fast都++。 最终slow的大小就是合法数组的大小
当双指针问题的时候我们采用while循环是更好的