力扣80:删除排序数组中的重复项 II

这道题要求我们原地删除重复出现的元素,使得每个元素最多出现两次,并返回删除后数组的新长度。同时,题目要求使用 O(1) 的额外空间来实现。

一、双指针解法

思路:

由于数组是有序的,我们可以使用双指针法来解决这个问题。我们可以定义两个指针 slowfast 分别指向处理后的数组的末尾和当前处理的位置。

  1. 从第三个元素开始,我们比较当前元素与慢指针向前两步的元素是否相同。
  2. 如果相同,则说明当前元素出现次数已经超过两次,直接跳过;
  3. 如果不同,则将当前元素复制到慢指针位置,并移动慢指针。

算法实现:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = nums.size();
        int slow = 2; // 慢指针,初始位置为2
        int fast = 2; // 快指针,初始位置为2
        while (fast < len) {
            if (nums[slow - 2] == nums[fast]) {
                fast++; // 当前元素出现次数已经超过两次,快指针继续向前移动
            } else {
                nums[slow] = nums[fast]; // 复制当前元素到慢指针位置
                slow++; // 慢指针向前移动
                fast++; // 快指针向前移动
            }
        }
        return slow; // 返回处理后数组的新长度
    }
};

二、测试数据 [0,0,1,1,1,1,2,3,3] 的处理过程:

初始时,数组为 [0,0,1,1,1,1,2,3,3]

  1. 初始时,慢指针和快指针均指向索引位置2,对应元素为1。
  2. 比较当前元素1和慢指针向前两步的元素0是否相同,不同,因此将1复制到慢指针位置,即 nums[2] = 1,慢指针和快指针都向前移动一步。
  3. 比较当前元素1和慢指针向前两步的元素0是否相同,相同,因此跳过当前元素1,快指针向前移动一步。
  4. 比较当前元素1和慢指针向前两步的元素1是否相同,不同,因此将1复制到慢指针位置,即 nums[3] = 1,慢指针和快指针都向前移动一步。
  5. 比较当前元素1和慢指针向前两步的元素0是否相同,相同,因此跳过当前元素1,快指针向前移动一步。
  6. 比较当前元素1和慢指针向前两步的元素1是否相同,不同,因此将1复制到慢指针位置,即 nums[4] = 1,慢指针和快指针都向前移动一步。
  7. 比较当前元素1和慢指针向前两步的元素1是否相同,相同,因此跳过当前元素1,快指针向前移动一步。
  8. 比较当前元素2和慢指针向前两步的元素1是否相同,不同,因此将2复制到慢指针位置,即 nums[5] = 2,慢指针和快指针都向前移动一步。
  9. 比较当前元素3和慢指针向前两步的元素1是否相同,不同,因此将3复制到慢指针位置,即 nums[6] = 3,慢指针和快指针都向前移动一步。
  10. 比较当前元素3和慢指针向前两步的元素2是否相同,不同,因此将3复制到慢指针位置,即 nums[7] = 3,慢指针和快指针都向前移动一步。

处理完成后,数组变为 [0,0,1,1,2,3,3],返回慢指针位置7,表示处理后数组的新长度为7。

结语

通过上述双指针的方法,我们可以在 O(n) 的时间复杂度内解决这个问题,同时不使用额外的空间,满足了题目的要求。

相关推荐

  1. 80删除排序数组重复 II

    2024-03-14 15:36:07       41 阅读
  2. 80.删除有序数组重复

    2024-03-14 15:36:07       33 阅读
  3. 80. 删除有序数组重复 II

    2024-03-14 15:36:07       50 阅读
  4. leetCode80. 删除有序数组重复 II

    2024-03-14 15:36:07       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 15:36:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 15:36:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 15:36:07       87 阅读
  4. Python语言-面向对象

    2024-03-14 15:36:07       96 阅读

热门阅读

  1. AI辅助研发:2024年科技与工业领域的新革命

    2024-03-14 15:36:07       44 阅读
  2. Redis的快速入门【全方位进攻】

    2024-03-14 15:36:07       44 阅读
  3. mac笔记本执行定时任务

    2024-03-14 15:36:07       53 阅读
  4. Rust 的 inline 内联编译策略

    2024-03-14 15:36:07       41 阅读
  5. Elastic script_score的使用

    2024-03-14 15:36:07       45 阅读
  6. 代码即文档?

    2024-03-14 15:36:07       46 阅读
  7. 前端面试 ===> 【ES6】

    2024-03-14 15:36:07       32 阅读
  8. 突破编程_C++_设计模式(备忘录模式)

    2024-03-14 15:36:07       38 阅读
  9. 大带宽服务器租用 满足高速网络访问

    2024-03-14 15:36:07       42 阅读