刷题日期:2026.4.23
题目:80. 删除有序数组中的重复项 II难度:中等语言:C 语言
参考文章:https://blog.csdn.net/weifeng425/article/details/132176731
参考视频:https://www.bilibili.com/video/BV18G5UzzE8c/
一、看到题目的第一想法
题目要求:有序数组原地去重,最多保留 2 个重复项。看到有序、原地、去重 →立刻想到快慢指针!和第 26 题思路几乎一样,只是判断条件变了。
二、解题思路(快慢指针)
- slow 慢指针:指向新数组应该放置的位置
- fast 快指针:遍历数组,检查当前元素是否需要保留
- 核心判断:
nums[fast] != nums[slow-2]意思:当前元素 不等于 新数组倒数第二个元素 → 可以保留 - 这样能保证同一个数字最多出现 2 次
三、AC 代码(C 语言)
c运行
int removeDuplicates(int* nums, int numsSize) { if (numsSize <= 2) return numsSize; int slow = 2; // 前两个一定保留 for (int fast = 2; fast < numsSize; fast++) { // 不和上上个重复,就保留 if (nums[fast] != nums[slow - 2]) { nums[slow] = nums[fast]; slow++; } } return slow; }四、实现过程中遇到的困难
不知道怎么判断 “最多两个”一开始想计数,很麻烦。✅ 解决:直接比较
fast和slow-2,超级简单。slow 从 0 开始出错会导致前两个元素被错误覆盖。✅ 解决:
slow和fast都从2开始。边界情况忘记处理数组长度 0、1、2 时直接返回即可。✅ 解决:开头加判断。
五、今日收获心得
掌握通用去重模板最多保留 k 个重复项:
- 保留 1 个 → 判断
slow-1 - 保留 2 个 → 判断
slow-2 - 保留 k 个 → 判断
slow-k
- 保留 1 个 → 判断
快慢指针真的万能有序数组去重、删除元素、移动零,全部能用。
代码越写越简洁不用额外空间、O (n) 时间、逻辑清晰,这就是最优解。
刷题越来越有体系数组题型总结:
- 查找 → 二分
- 删除 / 去重 → 快慢指针
- 连续子数组 → 滑动窗口
- 螺旋矩阵 → 四边界
- 合并有序数组 → 逆序双指针
六、总结
LeetCode 80 是有序数组去重的经典进阶题。记住核心:fast 遍历,slow 构建,比较 nums [fast] 和 nums [slow-2]直接秒杀!
坚持每日一题,算法稳步提升!