今日复习了数组部分,对以下题目做了一个整理。
27. 移除元素
这里将不再详细讲述两层for
循环的暴力算法。其大致思路是:第一层for
循环遍历每一个元素,找到值为val
的元素之后,从该位置将每一个元素往前移动一位进行覆盖;整体数组长度减1。
解下来主要讲解两种方法:
方法1:
使用替换的方法,直接将等于val
的元素(我们记为ele
)用数组末尾元素nums[length]
进行替代,然后将数组长度length
减去1。这里需要注意的是代替元素ele
的末尾元素nums[length]
不一定不等于val
,所以需要再检测一次,即i -= 1
。
class Solution:def removeElement(self, nums: List[int], val: int) -> int:length = len(nums) - 1 i = 0while i <= length:if nums[i] == val:nums[i] = nums[length]length -= 1i -= 1i += 1return length + 1
方法2
使用双指针方法求解,双指针在算法题里面非常常见,例如,在本人整理快速排序的时候就有使用到双指针。这里也可以使用相同的思路,将pre
作为边界,左边是需要的元素,右边是不确定的元素。cur
指针负责找需要的元素,这里是nums[cur] != val
。
class Solution:def removeElement(self, nums: List[int], val: int) -> int:pre = -1cur = pre + 1length = len(nums)while cur <= len(nums) - 1:if nums[cur] != val:pre += 1nums[pre] = nums[cur]else:length -= 1cur += 1return length