力扣刷题(python)50天——第十四天:删除排序数组中的重复项

力扣刷题(python)50天——第十四天:删除排序数组中的重复项

题目描述

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,1,2],

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

你不需要考虑数组中超出新长度后面的元素。
示例 2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

你不需要考虑数组中超出新长度后面的元素。
说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法

起初想的很简单,写好代码才发现由于调用了pop方法,虽然l已经固定,最外层for循环没影响,但是内层想去调用时可能出现out of range 的错误,且由于列表位置的变化,索引得到的也不是我想要的。因此引入一个变量来修正索引值 i

解答

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        l=len(nums)
        if l==0 or l==1:
            return l
        flag=0
        for i in range(1,l):
            i-=flag
            if nums[i]==nums[i-1]:
                nums.pop(i)
                flag+=1
        return len(nums)

值得注意的是对于python,如果想去除列表中所有的None,最好用filter方法,或者用另一个空列表进行检测添加。

执行结果

力扣刷题(python)50天——第十四天:删除排序数组中的重复项_第1张图片

参考改进:

双指针:

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-xiang-by-/

感觉还是我的方法简单。。

你可能感兴趣的:(leetcode刷题,python,力扣,leetcode,删除排序数组中的重复项,双指针)