题目
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
解题思路
- 解题思路:
- 首先,先判断出元素只有一个或者两个的数组
- 因为元素最多可以出现两次,也就是说 nums = [1,1,1,2,2,3]
- 输出:5, nums = [1,1,2,2,3]
- 先尝试用双指针解决。
- 定义一个常量index,用于索引,在定义一个常量e,用于记录出现的次数。
- i从1开始,遍历数组,用覆盖原理,
- 判断条件是index+1的值与i不匹配,那么就覆盖掉index+1位置的元素。并且使e为1
- 如果e是1或者2,那么使e++,
- 如果e>2,终止本次循环
代码
public int removeDuplicates(int[] nums) {
if (nums.length == 0 || nums.length == 1 || nums.length == 2) {
return nums.length;
}
int index = 0;
int e = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] != nums[index]) {
nums[index + 1] = nums[i];
index++;
e = 1;
} else if (e < 2) {
nums[index + 1] = nums[i];
index++;
e++;
}
}
return index + 1;
}