用双指针的技巧解决数组类的问题比较常见,题目里大多会出现原地修改数组的字眼。
在数组中没有指针,我们将用索引作为指针。
⭐关键:快指针每一步都会动,而慢指针只有快指针找到符合条件的数交给慢指针才会动。
快指针找到不等于val的元素,交给慢指针,慢指针才会移动。
public int removeElement(int[] nums, int val) {
int fast = 0,slow = 0;
while(fast < nums.length){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
快指针找到不重复的元素,慢指针才会移动,交给慢指针的下个位置。
public int removeDuplicates(int[] nums) {
int slow=0,fast=0;
while(fast < nums.length){
if(nums[slow] != nums[fast]){
slow++;
nums[slow] = nums[fast];
}
fast++;
}
return slow+1;
}
快指针找到不重复的元素且重复但是出现次数小于2的元素,慢指针才会移动,交给慢指针的下个位置。用count计算着出现次数。
public int removeDuplicates(int[] nums) {
if(nums.length == 0){
return 0;
}
int slow=0 ,fast=0;
int count = 0;
while(fast < nums.length){
if(nums[slow] != nums[fast]){
slow ++;
nums[slow] = nums[fast];
} else if(slow < fast && count < 2){
slow ++;
nums[slow] = nums[fast];
}
fast++;
count++;
if( fast<nums.length && nums[fast]!=nums[fast-1]){
count = 0;
}
}
return slow + 1;
}
快指针找到不为0的元素,交给慢指针,慢指针才会移动。注意最后把数组后的元素都赋值为0。
public void moveZeroes(int[] nums) {
int slow = 0, fast = 0;
while(fast<nums.length){
if(nums[fast] != 0){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
for(int i=slow;i<nums.length;i++){
nums[i] = 0;
}
}