【leetcode面试经典150题】-80. 删除有序数组中的重复项 II
- 1 题目介绍
- 2 个人解题思路
- 2.1 代码
- 2.2 思路
- 3 官方题解
1 题目介绍
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
2 个人解题思路
2.1 代码
class Solution {public int removeDuplicates(int[] nums) {int length=nums.length; int cur=0;int index=nums[cur];for(int right=1;right<length;right++){int freq=1;while(index==nums[right]){if(freq<2){freq++;cur++;nums[cur]=nums[right];}right++;if(right>=length){return cur+1;}}cur++;nums[cur]=nums[right];index=nums[right]; }return cur+1;}
}
2.2 思路
每次比对index和right。一样交换跳过,用freq记录有多少个相同,<2时cur和right同时++,>=2时只有right++
3 官方题解
class Solution {public int removeDuplicates(int[] nums) {int n = nums.length;if (n <= 2) {return n;}int slow = 2, fast = 2;while (fast < n) {if (nums[slow - 2] != nums[fast]) {nums[slow] = nums[fast];++slow;}++fast;}return slow;}
}
初始slow和fast相同位置第三个元素,对比slow的前两个元素即第0号元素,如果fast于0相同,则fast移动,如果直到移至不同地方,slow移动,这样保证只有两个相同元素。slow指向真实数组的下标。