1、题目介绍
- 题目详情【编号27】
- 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
- 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
- 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
2、我的思路及代码
class Solution {
public int removeElement(int[] nums, int val) {
/**
1、先设定两个标志位i与j,
i是从前往后找,查找到下一个等于val的数组值的下标,
j是从后往前找,查找到下一个不等于val的数组值的下标。类似于快速排序查找。
2、之后循环将nums[i] = nums[j],直到不满足i <= j 这个条件时候停止查找并替换。
3、时间复杂度O(n),空间复杂度O(1)。
*/
int i = 0, j = nums.length - 1, k = 0, n = nums.length;
while( i < j ){
while( i < n && nums[i] != val){
i++;
}
while( j > 0 && nums[j] == val){
j--;
}
if( i < j ){
k++;
nums[i++] = nums[j--];
}
}
while(i < n){
if(nums[i] == val){
k++;
}
i++;
}
return n - k;
}
}
3、官方题解
4、结论
- 我的思路主要和第二种方法相似,但是优化程度不足。
- 我忽略了第一种方法初始地方的快慢双指针方法。
- 缺少对第二种方法的优化,有些步骤重复走了。