80. Remove Duplicates from Sorted Array II

仅供自己学习

思路:
题目要求原地算法,在考虑因为最大有两个重复元素。那么我们运用双指针,一个用来记录遍历过且修改为不重复的数组长度slow,一个用来记录当前位置的fast指针。这个问题容易找到超过两个元素的重复元素,但是如何去掉是个问题。
因为我们允许重复两个,那么我们每次判断都是slow-2的元素和fast判断, 如果fast和slow-2的元素相等,那么slow不变,直到fast找到不等的,然后slow的位置就被fast位置的元素代替,那么连续的元素就会被中断只有两个元素,又因为是有序的,后面的元素肯定和重复的不同,所以会一直将重复的覆盖掉,然后slow加一。fast不管slow-2如何都会加一,因为是要一直遍历的。
最后 nums[0]~nums[slow]的元素都是删重复元素后得到的,slow也是长度。

代码:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int slow=2,fast=2;
        int n=nums.size();
        if(n<2) return n;
        while(fast<n){
            if(nums[slow-2]!=nums[fast]){
                nums[slow]=nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }
};

上述可优化为

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int i=0;
        if(nums.size()<2) return nums.size();
        for(auto& num:nums){  //因为从头开始遍历,所以i也需要等于0
            if(i<2||nums[i-2]<num){  //这里i<2的条件是为了解决numS[i-2],i-2小于0的问题,比较用小于是因为是升序,只要小于肯定不相等
                nums[i++]=num;
            }
        }
        return i;
    }
};
posted @ 2021-04-06 23:55  Mrsdwang  阅读(27)  评论(0编辑  收藏  举报