27、移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
显而易见的解决方法是通过 while + splice 处理,但是 splice 操作方法是非常耗时的,每次删除元素之后,需要重排数组中的元素,具有相同副作用的操作方法还有unshift和shift。(具体可以查看 V8 源码)
相比较下,pop 和 push 则是非常快的操作方法,这里可以采用双指针 + pop 操作方法,进一步优化时间复杂度:
var removeElement = function(nums, val) {
const max = nums.length
let start = 0
let end = max - 1
while(start <= end) {
if(nums[end] === val) {
nums.pop()
//pop()方法从数组中删除最后一个元素,
//并返回该元素的值。此方法更改数组的长度。
end--
continue
}
if(nums[start] === val){
nums[start] = nums[end] // 将索引为end 的元素赋值给start 然后将end 删除
nums.pop()
end--
start++
continue
}
start++
}
return nums.length
};
// 时间复杂度O(n)
// 空间复杂度O(1)
总结
刷题打卡第三天,选择力扣第27题,继续学习了双指针,一起加油哇~
❤️ 感谢大家
如果你觉得这篇内容对你挺有有帮助的话: 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)关注公众号给npy的前端秘籍,我们一起学习一起进步。 觉得不错的话,也可以阅读其他文章(感谢朋友的鼓励与支持🌹🌹🌹)