给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
public int removeElement(int[] nums, int val) {
if( nums == null || nums.length == 0 ){
return 0;
}
int left = 0 ,right = nums.length - 1;
while(left < right ){
while( left < right && nums[left] != val ) left++;
while( left < right && nums[right] == val) right--;
swap(nums,left,right);
}
return nums[left] == val? left:left+1;
}
public void swap(int[] nums, int index1, int index2){
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
双指针法: 明确left ,right 的含义:left 表明 [0,left] 不是val ;right表明 [right,nums.length]是val
- 时间复杂度:O(n)
- 空间复杂度:O(1)