- Notifications
You must be signed in to change notification settings - Fork24
Open
Labels
Description
双指针
先明确题意,题目要求我们原地操作。
- 借助 left、right 双指针,从起点出发,right 指针指向当前元素,left 指针指向将要赋值的位置
- 如果右指针指向的元素不等于 val,将右指针指向的元素赋值到左指针的位置,左右指针同时前进一步
- 如果右指针指向的元素等于 val,那么它不能在最终的输出数组里,左指针不动,右指针前进一步
- 输出 left 即为数组的长度
在极端情况下,nums 数组中没有元素等于 val,那么左右指针各遍历了一次数组。
constremoveElement=function(nums,val){constlen=nums.lengthletleft=0for(letright=0;right<len;right++){if(nums[right]!==val){nums[left]=nums[right]left++}}returnleft}
- 时间复杂度: O(n)
- 空间复杂度: O(1)
双指针夹逼
- 借助双指针,left 从数组的头出发,right 从数组的尾出发,不断向中间夹逼遍历
- 如果左指针指向的元素等于 val,将右指针指向的元素赋值到左指针的位置,右指针向左移动一步
- 如果赋值过来的元素也等于 val,那么就继续将右指针指向的元素赋值到左指针的位置,覆盖上一步等于 val 的元素
- 当左指针指向的元素不等于 val 时,左指针向右移动一步
- 最后当左指针和右指针相遇时,遍历完成,返回 left 即可
这种方法在极端情况下,左右指针加起来只遍历了数组一次。
constremoveElement=function(nums,val){letleft=0letright=nums.lengthwhile(left<right){if(nums[left]===val){nums[left]=nums[right-1]right--}else{left++}}returnleft}
- 时间复杂度: O(n)
- 空间复杂度: O(1)