要点
- input: nums->list, val->int . output: k -> int, k is the number of elements remained.
- No extra space for another array, O(1) extra memory
代码
class Solution:def removeElement(self, nums: List[int], val: int) -> int:if(len(nums)==0):return 0else:curr_index = 0for i,value in enumerate(nums):if(val!=value):nums[curr_index]=valuecurr_index+=1return curr_index
此题与26.Remove Duplicates from Sorted Array方法是完全一样的。就不过多解释了。
特殊情况
如果val出现在数组的第一项或者最后一项或者出现次数稀少,有没有比上面更快的方法呢?
代码
class Solution:def removeElement(self, nums: List[int], val: int) -> int:i = 0n = len(nums)while (i < n):if (nums[i] == val):nums[i] = nums[n - 1]n-=1else:i+=1return n
以上原理是,每当遇到相同项就将其与最后一项调换,并抛弃最后一项。否则继续检查数组中的下一个值。
这样做的好处是line 6 assignment次数等同于相同项出现的次数,与之前方法:我们每次遇到不同项就做一次assignment。所以,当我们知道出现数很少出现的时候,会大大减少assignment statement的数量,从而更快。
