26. 删除有序数组中的重复项

题目

自己第一次写出来的通过的代码:

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

特别要注意数组的越界情况,涉及到nums[fast]nums[slow]的使用时,一定要保证此时的fastslow都在数组的范围内,没有越界。

不过看了下官方题解

这个官方题解和我写法不同,它的写法和思路更优,数组越界问题可以避免。

img

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

感觉很妙的那句话是:

如果 nums[fast] != nums[fast−1],说明 nums[fast] 和之前的元素都不同,因此将 nums[fast] 的值复制到 nums[slow],然后将 slow 的值加 1,即指向下一个位置。

自我感觉这句话是建立在数组是非单调递增的这一条件上,如果nums[fast] != nums[fast−1],那么nums[fast]一定大于 nums[fast−1]及它左边的数,自然nums[fast] 和之前的元素都不相等。

posted @ 2024-11-04 20:07  hisun9  阅读(18)  评论(0)    收藏  举报