问题背景
给你一个有序数组 n u m s nums nums,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素 只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O ( 1 ) O(1) O(1) 额外空间的条件下完成。
数据约束
- 1 ≤ n u m s . l e n g t h ≤ 3 × 1 0 4 1 \le nums.length \le 3 \times 10 ^ 4 1≤nums.length≤3×104
- − 1 0 4 ≤ n u m s [ i ] ≤ 1 0 4 -10 ^ 4 \le nums[i] \le 10 ^ 4 −104≤nums[i]≤104
- n u m s nums nums已按升序排列
解题过程
这题和 移动零 思路是很类似的,还可以进一步扩展到使每个元素出现次数不超过某个阈值,只要修改传入的参数即可。
大体的思路是遍历并维护,不断地当前的遍历位置将元素覆盖到维护的位置就可以了。
具体实现
java
class Solution {
public int removeDuplicates(int[] nums) {
return manage(nums, 2);
}
private int manage(int[] nums, int k) {
int res = 0;
for (int num : nums) {
if (res < k || nums[res - k] != num) {
nums[res++] = num;
}
}
return res;
}
}