【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指向真实数组的下标。