ST移除元素
1、一个数组、一个目标值。在数组中删除等于这个目标值的元素,然后返回新数组的大小。
2、数组是连续的、类型相近的元素的集合。如果要删除连续数组12345中的3,需要把4往前移位把3覆盖掉,把5往前移位,把4覆盖掉,最后一位就无所谓了。新数组在真正内存空间上大小还是5,但经过某些包装以后,返回的size值可能会变成4。
3、erase函数是O(n)的操作,在数组中删除一个元素,是要将后面的元素整体往前移动。如果题目用库函数直接就可以解决了,这样就不要用库函数做了,如果库函数仅仅是解决问题的一小步,并且我们知道这个库函数里面的内部实现过程以及时间复杂度,可以用。
4、做法是,先用一个for循环去遍历数组,假如要删除元素3,遇到了元素3,再用一个for循环,把后面的元素一个个的向前覆盖。
5、双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针:
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组;
慢指针:指向更新,新数组下标的位置;
6、注意这些实现方法并没有改变元素的相对位置!
时间复杂度:O(n)
空间复杂度:O(1)
7、JS代码:
//快指针i:从头到尾逐个检查数组里的元素,判断是不是要移除的val;
//慢指针k:只负责记录 “需要保留的元素该放在哪个位置”,最终k的数值就是保留下来的元素个数。
//核心逻辑:i找到 “有用的元素(不等于 val)”,就交给k放到 “新位置”,整理员k再往前走一步,等着接收下一个有用的元素。
var removeElement = (nums, val) => {
let k = 0;
for(let i = 0;i < nums.length;i++){
if(nums[i] != val){
nums[k++] = nums[i]
}
}
return k;
};

浙公网安备 33010602011771号