LeetCode——删除排序数组中的重复项

一.个人探索

二.网上优秀编程

三.程序扩展

题目描述:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

题目解读:
1)给定的是一个排序数组,暗示相同的元素会紧挨在一起
2)不要用额外的数组空间,也就是只能对原数组进行修改

一.个人探索

1.del函数的应用

答题思路:为了防止出现数组元素超出范围的情况,我们采取倒序进行删除的方法
具体程序如下:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        for i in range(len(nums)-1,0,-1):
            if nums[i]==nums[i-1]:
                del nums[i]
        return len(nums)

这个程序的运行效果较优,运行速度较快
在这里插入图片描述
总体运行情况也很稳定

在这里插入图片描述
优点:简单易编写,运行速度和内存消耗效果都很好

2.while,for双循环法

产生这种思路的主要原因是没有考虑到所给数组是已经排好序列的了。
答题思路:利用while循环的条件可以动态变化的特点,内部嵌套上for循环进行正向逐一排查,并利用remove函数或者del函数进行移除
优点:能够排查彻底
缺点:耗费时间太多
具体程序如下:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        i=0
        k=0
        while i<len(nums):
            for j in range(i):
                if nums[j]==nums[i]:
                    nums.remove(nums[i])#也可以改成del nums[i]
                    k=1
                    break
            if k==1:
                k=0
                continue
            i=i+1
        return len(nums)

程序运行的时间也是很慢:
在这里插入图片描述

3.for,for双循环

这个方法跟第二种差不多
具体程序如下:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        for i in range(len(nums)-1,-1,-1):
            for j in range(i-1,-1,-1):
                if nums[j]==nums[i]:
                    nums.remove(nums[i])
                    break
        return len(nums)

二.网上优秀编程

双指针法

思路:由于必须要原地删除,就不考虑用其他数据结构储存。然后可以想到,用指针变量来辅助存储。
双指针思想:相当于从原地,得到了一个与原数据结构有关联新数据结构。
题目特征和需要注意的地方:
1.输入空列表
如果不加上前提条件,会出现空列表错误
2.给出的是有序列表(?)
无序列表无法用此种方法解题
具体程序如下:

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

作者:linksnow
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shen-ru-li-jie-shu-zu-zhong-shi-yong-shuang-zhi-zh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三.程序扩展

如果可以用外加数组来做并且考虑不是有序数组的话,可以采用下面的这种形式:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        a=[]
        for i in range(len(nums)-1,0,-1):
            for j in range(i):
                if nums[j]==nums[i]:
                    a.append(i)
                    break
        for i in a:
            nums.remove(nums[i])
        return len(nums)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值