题意:
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/
视频链接:https://www.bilibili.com/video/BV18G5UzzE8c/
一 我的思路
这题是上一题的升级版。
上一题是每个数字只留 1 个,这题是每个数字最多留 2 个。
思路还是双指针:
慢指针:记录新数组该放哪里
快指针:遍历整个数组
只要当前数字 和 慢指针前面第二个数字不一样,就保留
二 代码的实现
class Solution { public: int removeDuplicates(vector<int>& nums) { if (nums.size() <= 2) return nums.size(); int slow = 2; for (int fast = 2; fast < nums.size(); fast++) { if (nums[fast] != nums[slow - 2]) { nums[slow] = nums[fast]; slow++; } } return slow; } };三 我遇到的困难
1 一开始还是想删元素,结果越写越乱
2 不知道要从下标 2 开始判断
3 搞不懂为什么要和 slow-2 比较
4 边界条件经常忘,比如数组长度小于 2 的情况
5 指针顺序搞反,调试好几次才过
四 学习总结
这道题是有序数组去重的进阶版,跟着双指针思路走
核心:
每个数字最多留两个,只要快指针的数,不和慢指针前面第二个数重复,就留下来。
比起上一题只留一个,这题只是多了一步判断,逻辑几乎一样。
学会这道题,我对双指针的用法更熟悉了,也更敢做数组题了
虽然还是会踩坑,但至少能独立写出来,真的很有成就感~