leetcode80&27 删除排序数组中的重复项 II&删除数

2019-08-03  本文已影响0人  dEADWOOD

被卡了N天,这题的要求很严格,既要求就地还要求只用O(1)空间还要求使用O(n)的时间

很棒的思路,总的来说跟unique的实现差不多,区别在于unique往前看1个此题需要看2个,可以自然的推广到k个的情况

解释一下代码含义
i是扫描的index,k是填充的index
前两个数自然什么都不用管直接填充即可,关键在于第3个数开始需要判断它是否跟k-2位置的数相等,如果和k-2位置的数相等,则意味着i和k-2和k-1位置的数都相等,需要放弃,否则就填充

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int k = 0;
        for(int i = 0; i < nums.size(); ++i)
            if(k < 2 or nums[i] != nums[k-2]) nums[k++] = nums[i];
        return k;
    }
};

同样的思路也可以用在27上,防止因为自己傻逼而挂掉

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int k = 0;
        for(int i = 0; i < nums.size(); ++i) 
            if(nums[i] != val) nums[k++] = nums[i];
        return k;
    }
};

这样的写法比起while写法 时间复杂度好也更不容易出错

上一篇下一篇

猜你喜欢

热点阅读