Python 基础算法——删除有序数组中的重复项

文章介绍了如何在有序数组中删除重复元素,包括错误的函数法思路,正确的双指针法(时间复杂度和空间复杂度均为O(1)),以及不理想的递归算法,递归法虽然不适用但提供了递归思考方式。示例展示了在Python中实现这些方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

12. 删除有序数组中的重复项

给你一个升序排列的数组 nums,请你原地删除重复出现的元素,使每个元素只出现一次,

返回删除后数组的新长度。元素的相对顺序应该保持 一致 。然后返回nums中唯一元素的个数。

示例:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

常用的算法分别是:函数法双指针法递归算法

函数法:(这个方法是错误的,本人也不清楚,有知道的评论区指教指教~)

函数法的思路:使用 set() 去重。

# 函数法    时间复杂度:O(n)    空间复杂度:O(1)
def remove_duplicates1(nums):
    return len((set(nums)))

双指针法:

双指针法的思路:利用了数组有序的特点,i, j 两个指针协同工作,实现空间 O(1) 的原地去重。

# 双指针法    时间复杂度:O(n)    空间复杂度:O(1)  
def remove_duplicates2(nums):
    i = 0
    for j in range(1, len(nums)):
        if nums[i] != nums[j]:
            i += 1
            nums[i] = nums[j]
    return i + 1

递归算法:(此算法也不算是合格,因为递归占据了系统占空间)

递归算法的思路:通过递归层层比较相邻元素,实现了整个数组的去重。

# 递归算法  时间复杂度:O(n)    空间复杂度:O(n)
def remove_duplicates3(nums):
    if not nums:
        raise Exception('数组中没有元素!')
    if len(nums) == 1:
        return 1
    
    i = 1
    while i < len(nums) and nums[i] == nums[0]:
        i += 1
    
    return 1 + remove_duplicates3(nums[i:])

题目来源:力扣 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值