1 题目描述
2 解题思路
一般来说,原地修改指针的题目,都是快慢指针来实现的。
2.1 传统快慢指针
时间复杂度:O(n),其中 n 为序列的长度。我们需要遍历该序列至多两次。
空间复杂度:O(1)。我们只需要常数的空间保存若干变量。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow=0
fast=0
l=len(nums)
while(fast<l):
if(nums[fast]==val):
fast+=1
else:
nums[slow]=nums[fast]
slow+=1
fast+=1
return(len(nums[:slow]))
2.2 改良快慢指针(仅限本题)
如果要移除的元素恰好在数组的开头,例如序列 [1,2,3,4,5],当val 为 1 时,我们需要把每一个元素都左移一位。注意到题目中说:「元素的顺序可以改变」。实际上我们可以直接将最后一个元素 5 移动到序列开头,取代元素 1,得到序列[5,2,3,4],同样满足题目要求。这个优化在序列中 val 元素的数量较少时非常有效。
实现方面,我们依然使用双指针,两个指针初始时分别位于数组的首尾,向中间移动遍历该序列。
这样的方法两个指针在最坏的情况下合起来只遍历了数组一次。比2.1的最坏情况少遍历了一遍数组
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
l=len(nums)
front=0
back=l-1
while(front<=back):
print(front,back,nums)
if(nums[front]==val):
nums[front]=nums[back]
back-=1
else:
front+=1
return(len(nums[:front]))