给你一个有序数组 nums
,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
提示:
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums
已按升序排列
解析思路:这道题妙就妙在了一个地方,就是slow-2这个操作上,首先啊,我们肯定是要判断这个数组长度是否大于2,不大于2,直接返回长度即可,然后还是快慢指针,快指针在前,满指针灾后,但是判断的是nums[slow-2]和nums[fast]的值,如果相等,满指针不动,快指针向前,如果不相等,慢指针被赋值为快指针的值,并且慢指针向前移动。
class Solution {
public int removeDuplicates(int[] nums) {
int n = nums.length;
int fast = 2;
int slow = 2;
if(n<=2){
return n;
}
while(fast<n){
if(nums[slow-2] !=nums[fast]){
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
}
打完收工!