从负数(不会编程)开始刷leetcode 【1】80. Remove Duplicates from Sorted Array II

使用语言: python
刷题顺序:https://medium.com/@yjiao7/1-leetcode-%E5%88%86%E7%B1%BB%E9%A1%BA%E5%BA%8F%E8%A1%A8%E7%AC%AC%E4%BA%8C%E7%89%88-%E5%A2%9E%E5%8A%A0%E9%87%8D%E7%82%B9250%E9%A2%98-bbf97a646edc
题目:从负数(不会编程)开始刷leetcode 【1】80. Remove Duplicates from Sorted Array II_第1张图片解题: 题目要求给出一个修改后的list,使得list的前n个元素满足单种元素最多重复一次的要求。
思路:将list想成两部分,一部分是处理后的,一部分是未处理的。不断寻找符合要求的元素,每找到一个就将其放在处理后的那段的末尾。
原始代码:64ms ,13.8 MB。为什么那么慢呢?

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        l = len(nums)
        if l < 3:
            return l
        else:
            next = 2
            for i in range(2,l):
                if nums[i] != nums[next - 2]:
                    nums[next] = nums[i]
                    next += 1
            return next

修改后的代码:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        next = 2
        l = len(nums)
        for i in range(2,l):
            if nums[i] != nums[next - 2]:
                nums[next] = nums[i]
                next += 1
        return min(next, l)

虽然并没有改变速度,但是更加美观。就算len(nums) < 3也不会报错,因为range函数的第二个参数小于第一个时,for loop不会执行
for loop 还有以下特性:

a = [1,2,3]
for i in a:
    print(i)
    print(a)
    a.pop(0)
-->
1
[1, 2, 3]
3
[2, 3]

I的取值是每次循环时按a的index来取的。

另一种思路:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        Next = 2
        i = 2
        while i < len(nums):
            if nums[i] == nums[Next-2]:
                del nums[i]
            else:
                Next += 1
                i += 1
        return min(Next,len(nums))

你可能感兴趣的:(Leetcode)