leetcode 27【移除元素】
题目链接
https://leetcode-cn.com/problems/remove-element/
解题思路与代码思路:
双指针
使用的是快慢指针思想,初始化两个指针,i指针是为了建立答案的指针,j指针是移动搜索val值的指针,j找到val就跳过它,找不到就令nums[i]=nums[j],这样前面的数字都是不等于val的,并i挪后,最后i所处的位置,就是答案的长度
删除元素较少的双指针
第一个解法会不断做复制操作,当数组中的val元素存在的比较少,就有太多不必要的复制了,这个解法采用头尾双指针的思想,头指针找到val就替换成最后一个元素的值,然后移动尾指针,若找不到val,就头指针后移,直到头尾指针碰面,说明都把所有元素看了一遍。
代码:
双指针
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i = 0
for j in range(len(nums)):
if nums[j] != val:
nums[i] = nums[j]
i+=1
return i
删除元素较少的双指针
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
j = len(nums)
i = 0
while i<j:
if nums[i] == val:
nums[i] = nums[j-1]
j-=1
else:
i+=1
return j
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(1)
虽然时间复杂度一致,但是第二种解法中,赋值操作的次数等于要删除的元素的数量。因此,如果要移除的元素很少,效率会更高。