80. 删除有序数组中的重复项II
双指针法
class Solution {
public int removeDuplicates(int[] nums) {
/**
* 双指针遍历数组
* 定义一个flag来指示重复元素出现的次数
*/
int n = 0;
int flag = 0;
for (int i = 1; i < nums.length; i++) {
if (nums[n] < nums[i]){
n++;
if (i != n) {
nums[n] = nums[i];
}
flag = 0;
}
/**
* flag等于0时进入该判断,说明元素刚好重复了两次
* 此时累计flag,n的下一个元素肯定需要被覆盖
*/
else if (flag < 1){
flag++;
n++;
nums[n] = nums[i];
}
/**
* 如果重复次数超过2,就让i一直往前遍历
*/
else if (flag == 1){
continue;
}
}
return n + 1;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
优化1——以2为间隔进行判断
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length <= 2){
return nums.length;
}
/**
* 数组至少需要有两个元素,因此结果数组长度起始为2
* length指的是长度,不是索引
*/
int length = 2;
for (int i = 2; i < nums.length; i++) {
/**
* 直接从第3个元素开始遍历
* 如果当前遍历元素不等于左边第二个元素,说明没有数字重复2次以上
* 注意左边第二个元素是结果数组的nums[length - 2],而不是原始数组的nums[i - 2],因为原始数组中间可能有无效的重复元素
*/
if (nums[i] != nums[length - 2]){
nums[length] = nums[i];
length++;
}
}
return length;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/