不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
1.暴力法,双层for循环,时间复杂度高
2.快慢指针。快慢指针在数组、链表以及字符串的操作中经常被使用。
其中,快指针去搜索新的元素,慢指针始终指向要更新的元素。
快慢指针都从第一个元素开始。(1)
当快指针指向的元素与val不相等,快指针将自己指向的元素先赋给慢指针指向的元素,快慢指针都指向下一个元素。(2)
当快指针指向的元素与val相等,就将快指针指向下一个元素,慢指针不动,直到快指针指向一个与val不等的元素,返回(2)
这种方法没有改变数组中元素的相对位置
class Solution {
public int removeElement(int[] nums, int val) {
int len=nums.length;
int slow=0;
int fast;
for(fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
}
3.左右指针
左指针指向第一个元素,右指针指向最后一个元素
右指针从后往前搜索,直到找到一个不为val的元素。
左指针从前往后搜索,直到找到一个等于val的元素。
将右指针指向的元素复制到左指针指向的元素中去。
这种做法导致数组中元素相对位置变化。
class Solution {
public int removeElement(int[] nums, int val) {
int len=nums.length;
int low=0;
int high=len-1;
while(low<=high){
while(low<=high&&nums[high]==val){
high--;
}
while(low<=high&&nums[low]!=val){
low++;
}
if(low<high){
nums[low]=nums[high];
high--;
low++;
}
}
return low;
}
}