给你一个有序数组 nums
,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
// 初始化变量
int k = 1; // 用于记录不重复元素的位置
int count = 1; // 用于记录当前元素的出现次数
// 遍历数组
for (int i = 1; i < nums.size(); i++) {
// 如果当前元素与前一个元素相同
if (nums[i] == nums[i - 1]) {
// 增加出现次数
count++;
// 如果出现次数小于等于2,则将当前元素复制到不重复元素的位置
if (count <= 2) {
nums[k++] = nums[i];
}
} else { // 如果当前元素与前一个元素不同
// 将当前元素复制到不重复元素的位置
nums[k++] = nums[i];
// 重置出现次数为1
count = 1;
}
}
// 返回不重复元素的位置,即删除后数组的新长度
return k;
}
};
假设我们有一个有序数组 nums
:
nums = [1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
我们希望删除重复元素,使得每个元素最多出现两次
算法执行过程:
-
初始化变量:
k
被初始化为 1,表示不重复元素的位置。count
被初始化为 1,表示当前元素的出现次数。
-
遍历数组:
- 我们从索引 1 开始遍历数组,因为索引 0 的元素不需要比较。
-
处理重复元素:
- 当我们遇到第一个重复元素时(索引 1,值为 1),我们将
count
加 1。此时count
为 2,满足条件count <= 2
,所以我们将该元素复制到不重复元素的位置nums[k]
,并将k
加 1。 - 当我们遇到第二个重复元素时(索引 2,值为 1),我们再次将
count
加 1。此时count
为 3,不满足条件count <= 2
,所以我们不做任何操作。
- 当我们遇到第一个重复元素时(索引 1,值为 1),我们将
-
处理新元素:
- 当我们遇到一个新的元素时(索引 3,值为 2),我们将该元素复制到不重复元素的位置
nums[k]
,并将k
加 1。同时,我们将count
重置为 1。
- 当我们遇到一个新的元素时(索引 3,值为 2),我们将该元素复制到不重复元素的位置
-
继续遍历和处理:
- 我们继续遍历数组,并根据元素的重复情况进行相应的处理。
-
返回新长度:
- 遍历结束后,我们返回
k
的值,即不重复元素的位置,作为删除后数组的新长度。
- 遍历结束后,我们返回
执行结果:
- 遍历结束后,数组
nums
变为:[1, 1, 2, 2, 3, 3, 4, 4, 4, 4, _, _]
(其中_
表示未使用的元素)。 - 新的长度为 8,表示不重复元素的位置。