告诫自己:贵在坚持!
题目:
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
1,代码
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
let index=0,right=0;
while(right<=nums.length-1){
if(nums[right]!= val){
nums[index++]=nums[right++];
}else
{
right++;
}
}
return index;
};
2,学习与总结
2.1需要掌握的重点思路--双指针
设置index 和 right两个指针
- index用来跟踪存储不等于val的元素
- right用来筛选是否等于val
总体来说,将数组分成「前后」两段:
- 前半段是有效部分,存储的是不等于 val 的元素。
- 后半段是无效部分,存储的是等于 val 的元素。
2.2 优化拓展
场景:
如果要移除的元素恰好在数组的开头,例如序列 [1,2,3,4,5][1,2,3,4,5][1,2,3,4,5],当 val 为 1 时,我们需要把每一个元素都左移一位。(作者:力扣官方题解)
优化方法:
我们依然使用双指针,两个指针初始时分别位于数组的首尾,向中间移动遍历该序列。
核心实现思路:
左指针存放 不等于val的元素
如果左指针值等于val,则将right指向的元素赋值给left,并right--;
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
let left=0,right=nums.length - 1;
while(left<=right){
if(nums[left]=== val){
nums[left]=nums[right--];
}else
{
left++;
}
}
return left;
};