【算法刷题日记LeetCode 80 删除有序数组中的重复项 II|快慢指针通用解法 C 语言
刷题日期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快慢指针真的万能有序数组去重、删除元素、移动零全部能用。代码越写越简洁不用额外空间、O (n) 时间、逻辑清晰这就是最优解。刷题越来越有体系数组题型总结查找 → 二分删除 / 去重 → 快慢指针连续子数组 → 滑动窗口螺旋矩阵 → 四边界合并有序数组 → 逆序双指针六、总结LeetCode 80 是有序数组去重的经典进阶题。记住核心fast 遍历slow 构建比较 nums [fast] 和 nums [slow-2]直接秒杀坚持每日一题算法稳步提升