【Classic 150 刷题计划】 LeetCode 26. 删除有序数组中的重复项 | C++ 快慢双指针经典模板

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

📌 题目描述

题目级别:简单

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

要求:必须在 原地 修改输入数组,使用 O(1)O(1)O(1) 额外空间。

  • 示例 1:
    输入:nums = [0,0,1,1,1,2,2,3,3,4]
    输出:5, nums = [0,1,2,3,4]
    解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

💡 破题思路:快慢双指针 (原地覆盖)

面对"原地修改"且"保持相对顺序"的数组题目,快慢双指针 是绝对的首选武器。由于数组是有序的,这就意味着所有重复的元素必然是连续挨在一起的。

  • 慢指针 l:指向目前已经处理好的、没有重复元素的数组的最后一个位置。它就像一个"守门员",守护着已经去重完毕的纯净区域。
  • 快指针 r:负责在前面开路,遍历寻找与慢指针所指元素不同的"新元素"。它就像一个"侦察兵"。

核心动作:

  1. 初始状态下,l = 0,r = 1。因为数组的第一个元素绝对是不重复的,直接保留。
  2. 快指针 r 不断向右移动,逐个考察元素:
    • 如果 nums[r] == nums[l]:说明是重复元素,侦察兵直接跳过,继续往前探。
    • 如果 nums[r] != nums[l]:说明侦察兵找到了一个全新的元素 !我们就把这个新元素扔到守门员的下一个位置 nums[l+1] = nums[r],然后守门员 l 往前跟进一步,将新元素纳入保护区。
  3. 循环结束后,慢指针 l 的下标就代表了最后一个不重复元素的位置,那么去重后的有效数组长度就是 l + 1。

💻 C++ 代码实现 (原汁原味作者版)

cpp 复制代码
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        
        // 边界情况:如果数组只有一个元素,必定无重复,直接返回 1
        if (n == 1) return 1;

        // 定义快慢双指针
        int l = 0, r = 1;

        // 快指针 r 负责探路,直到遍历完整个数组
        while (r < n)
        {
            // 如果发现了全新的元素
            if (nums[l] != nums[r]) 
            {
                // 将新元素覆盖到慢指针的下一个位置
                nums[l + 1] = nums[r];
                // 慢指针向前推进一步,纳入该新元素
                l ++ ;
            }
            // 无论是否重复,快指针始终向前走
            r ++ ;
        } 

        // l 是最后一个不重复元素的下标,有效长度就是 l + 1
        return l + 1;
    }
};
相关推荐
the3clipse1 小时前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
CQU_JIAKE1 小时前
10.4【A】
算法
Godspeed Zhao1 小时前
现代智能雷达技术19——算法(5)
算法
(Charon)1 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
无名猿1 小时前
成员初始化列表与初始化顺序陷阱:按声明顺序,不是书写顺序
c++·现代c++·语法基础
Omics Pro1 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
Tisfy1 小时前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配
91刘仁德1 小时前
传输层协议深度拆解:端口寻址、UDP 报文与 TCP 可靠性机制全解析
linux·网络·c++·网络协议·tcp/ip·udp·c
小O的算法实验室1 小时前
IEEE TEVC,学习辅助的搜索路径重构进化算法
学习·算法·重构
Liuchang09111 小时前
洛谷 P2670 [NOIP 2015 普及组] 扫雷游戏
c++·算法·游戏