这种题要用快慢指针来做,用快指针一直往后遍历,慢指针指向要删除的地方,当快指针的值不是要删除的值的时候,用快指针位置的值覆盖慢指针的位置(或者交换位置,看题目要求)。时间复杂度为O(n)
public int removeElement(int[] nums, int val) {
int slow = 0;
for(int fast = 0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
该题和上面不一样的地方在于,慢指针先++再被覆盖。因为要判断fast的值和slow当前位置的数是否相等,而不是判断和slow下一个位置
public int removeDuplicates(int[] nums) {
int slow = 0;
for(int fast = 0;fast<nums.length;fast++){
if(nums[fast]!=nums[slow]){
slow++;
nums[slow] = nums[fast];
}
}
return slow+1;
}
此题的值不是覆盖,而是交换
public void moveZeroes(int[] nums) {
int slow = 0;
for(int fast = 0;fast<nums.length;fast++){
if(nums[fast]!=0){
int temp = nums[slow];
nums[slow] = nums[fast];
nums[fast] = temp;
slow++;
}
}
}