80. 删除排序数组中的重复项 II




代码一思路:

设两个指针cur、i,cur是有效元素下标,初值为0,i是从第一个元素开始的遍历指针;另外用count记录当前相同元素的个数;

i和cur指向的元素相同且count值小于2,说明cur指向的元素出现第二次,为有效元素,cur、i右移,count计数器加1;

i和cur指向的元素相同且count值不小于2,说明cur指向的元素出现已经大于两次,此后均是非有效元素,cur不动,仅i右移;

i和cur指向的元素不同,说明遇到新元素,为有效元素,cur、i右移,count计数器重置为1;

返回值是有效元素个数,即cur+1。

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        if not n:
            return 0
        count = 1
        cur = 0
        i = 1
        while i < n:
            # i和cur指向的元素相同且count值小于2,说明cur指向的元素出现第二次,为有效元素,cur、i右移,count计数器加1;
            if nums[i] == nums[cur] and count < 2:
                cur += 1
                nums[cur] = nums[i]
                count += 1
                i += 1
            # i和cur指向的元素相同且count值不小于2,说明cur指向的元素出现已经大于两次
            elif nums[i] == nums[cur] and count >= 2:
                i += 1
            # i和cur指向的元素不同,说明遇到新元素,为有效元素
            elif nums[i] != nums[cur]:
                cur += 1
                nums[cur] = nums[i]
                count = 1
                i += 1
        return cur + 1

代码二:代码一思路的优化。

因为元素是有序的,可以直接用nums[i]和nums[i-2]进行判断,如果相等,那么说明重复的元素一定超过了两个,当前元素需要跳过。

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        i = 0
        for item in nums:
            if i < 2 or nums[i - 2] != item:
                nums[i] = item
                i += 1
        return i
原文地址:https://www.cnblogs.com/panweiwei/p/14024730.html