leetcode笔记总结——(4)删除有序数组中的重复项(python和C++实现)

目录

  • 1、题目描述
  • 2、思路
  • 3、代码实现
    • (1)python代码:
    • (2)C++代码:
  • 4、总结:

1、题目描述

leetcode笔记总结——(4)删除有序数组中的重复项(python和C++实现)_第1张图片

2、思路

使用双指针来求解。

因为给定数组是有序的,所以相同元素必然连续。我们可以使用双指针解决本题,遍历数组检查每一个元素是否应该被保留,如果应该被保留,就将其移动到指定位置。具体地,我们定义两个指针 slowfast 分别为慢指针和快指针,其中慢指针表示处理出的数组的长度,快指针表示已经检查过的数组的长度,即nums[fast] 表示待检查的第一个元素,nums[slow−1] 为上一个应该被保留的元素所移动到的指定位置。

因为本题要求相同元素最多出现两次而非一次,所以我们需要检查上上个应该被保留的元素 nums[slow−2] 是否和当前待检查元素nums[fast] 相同。当且仅当nums[slow−2]=nums[fast] 时,当前待检查元素 nums[fast] 不应该被保留(因为此时必然有 nums[slow−2]=nums[slow−1]=nums[fast])。最后,slow 即为处理好的数组的长度。

特别地,数组的前两个数必然可以被保留,因此对于长度不超过 2 的数组,我们无需进行任何处理,对于长度超过 2 的数组,我们直接将双指针的初始值设为 2 即可。

3、代码实现

(1)python代码:

class Solution:
    def removeDuplicates(self, nums: list) -> int:
        if len(nums) <= 2:
            return len(nums)
        slow = fast = 2
        while fast < len(nums):
            if nums[slow - 2] != nums[fast]: # 当前检查的和前两个不相同,则保留
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

(2)C++代码:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = nums.size();
        if (len <= 2)
        {
            return len;
        }
        int slow = 2, fast = 2;
        while (fast < len)
        {
            if (nums[slow - 2] != nums[fast]) //当前检查的元素和前两个不同,则需要保留当前的元素
            {
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }
};

4、总结:

本题中的数组有序很重要,如果不是有序,那就不能这么做。
另外,对于这种去重的题,无论是可以保留几个相同的元素,都可以使用双指针来求解。

你可能感兴趣的:(力扣-leetcode算法题)