Problem Descriptions:
Follow up for “Remove Duplicates”:
What if duplicates are allowed at most twice?
For example,
Given sorted array nums = [1,1,1,2,2,3],
Your function should return length = 5, with the first five elements of nums
being 1, 1, 2, 2 and 3. It doesn’t matter what you leave beyond the new length.
分析:当后一个值和前一个值(nums[i]
和 nums[j]
) 不想等的时候 直接复制过来nums[++j] = nums[i]
将记录相同数值的flag
标记置为假flag = flase
; 如果两个值相同,下来看一下是不是第一次相同即flag
的值是否为flase
如果为真,说明这个值不能要,i
继续遍历下一个;如果flag
为假,说明这个就是第一次重复的值,按要求时需要添加进去,而且同时更新flag
为 true;
public class Solution{
public int removeDuplicates (int [] nums){
int j = 0 ;
boolean flag = false ;
for (int i = 1 ; i < nums.length; i++){
if (nums[i] != nums[j]){
nums[++j] = nums[i];
flag = false ;
}
else if (flag) continue ;
else {
nums[++j] = nums[i];
flag = true ;
}
}
return j+1 ;
}
}
还有一种解法:代码如下
public class Solution{
public int removeDuplicates (int [] nums){
if (nums.length < 2 ) return nums.length;
int index = 2 ;
for (int i = 2 ; i < nums.length; i++)
if (nums[i] != nums[index - 2 ]) nums[index++] = nums[i];
return index
}
}
算法分析:i
从2开始遍历,当第三个值nums[i]
和第一个值nums[index - 2]
相同的时候,那么由于数组是有序 的,所以第三个值肯定和第二个值(nums[i]
和 nums[index - 2]
中间的那个值)也是相同的,那么由于题目要求一个值最多只能出现2次,所以当前这个第三个值nums[i]
就不能添加到数组中,所以i++
遍历下一个值就好;如果当前的第三个值和第一个值不相同,那么和第二个值(nums[i]
和 nums[index - 2]
中间的那个值)是否相同都满足题目要求,所以直接将该值添加进数组(nums[index++] = nums[i]
)。接着遍历下一个值,思路都是一样的。