public int removeDuplicates(int[] nums) {
if(nums.length < 2) return nums.length;
int slow = 0;
for(int fast = 1, len = nums.length; fast < len; fast++) {
if(nums[slow] < nums[fast]) {
slow++;
nums[slow] = nums[fast];
}
}
return slow + 1;
}
快慢指针:
1.当慢指针和快指针所指元素相同时,slow不变化,fast++,直到fast > slow;
2.这时slow所指元素会被保留,slow++,slow所指元素再替换成fast所指元素;
3.最后新数组长度为slow + 1,因为slow所指元素就是最后一个元素。
升级版:
80. Remove Duplicates from Sorted Array II
public int removeDuplicates(int[] nums) {
if(nums.length < 3) return nums.length;
int slow = 0;
boolean isTwice = false;
for(int fast = 1; fast < nums.length; fast++) {
if(nums[slow] < nums[fast]) {
slow++;
nums[slow] = nums[fast];
isTwice = false;
} else if(nums[slow] == nums[fast]) {
if(isTwice == false) {
slow++;
nums[slow] = nums[fast];
isTwice = true;
}
}
}
return slow + 1;
}
这题将最多允许保留两个相同元素,那么我们设置一个变量来记录是否已经重复两个了。如果不是,则slow++,即slow移动到下一个位置,忽略这第二个重复元素,并用fast的元素替换slow的元素,且把isTwice设置为true,注意这里在下次fast > slow的时候要设置为false。