题目描述
给你一个有序数组 nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在原地并在使用O(1) 额外空间的条件下完成。
题解
定义两个指针slow和fast分别为慢指针和快指针,其中慢指针表示处理出的数组的长度,快指针表示已经检查过的数组的长度,即nums[fast]表示待检查的第一个元素,nums[slow−1]为上一个应该被保留的元素所移动到的指定位置。本题要求相同元素最多出现两次而非一次,所以我们需要检查上上个应该被保留的元素 nums[slow−2] 是否和当前待检查元素 nums[fast] 相同。当且仅当 nums[slow−2]=nums[fast] 时,当前待检查元素 nums[fast] 不应该被保留(因为此时必然有 nums[slow−2]=nums[slow−1]=nums[fast])。最后,slow 即为处理好的数组的长度。
public int removeDuplicates(int[] nums) {
int slow = 2, fast = 2;
int n = nums.length;
if (n <= 2) {
return n;
}
while(fast < n) {
if (nums[slow - 2] != nums[fast]) {
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
1321

被折叠的 条评论
为什么被折叠?



