题目

1641351315(1).png

要点

  1. input: nums->list, output: k -> int, k is the number of different elements.
  2. nums is in non-decreasing order
  3. No extra space for another array, O(1) extra memory

    代码

    1. class Solution:
    2. def removeDuplicates(self, nums: List[int]) -> int:
    3. if(len(nums)==0):
    4. return 0
    5. else:
    6. curr_val = nums[0]
    7. curr_index = 0
    8. for i,value in enumerate(nums,start=0):
    9. if value != curr_val:
    10. curr_val = value
    11. curr_index +=1
    12. nums[curr_index]=value
    13. return curr_index+1

    分析

    用curr_val记住上一次数字,以此判断这次的数字是否该存放。
    运用双指针curr_index, i。一个记住当前arr将要存放的位置,一个遍历数组。

额外细节

做题过程中发现用enumerate比用in range耗时更短。
一般来说,当同时需要 count 和 value的时候应该用enumerate,并且count可以不用从0开始。
注意:enumerate(nums, start=1)不代表从nums[1]开始循环,它只代表count从1开始计数。

更多关于enumerate的用法

why enumerate is better than in range in some cases?

第二次更新(2022/04/14)

代码

  1. class Solution:
  2. def removeDuplicates(self, nums: List[int]) -> int:
  3. prev = nums[0]
  4. curr_index = 1
  5. length_ = len(nums)
  6. for i in range(1,len(nums)):
  7. if(prev != nums[i]):
  8. nums[curr_index] = nums[i]
  9. prev = nums[i]
  10. curr_index += 1
  11. return curr_index

`