Leetcode.P1 删除排序数组中的重复项

 

数据结构基础差,打算开始刷一些leetcode题目练练手,持续记录起来。

题目:删除排序数组中的重复项
初步思路:
  两重循环,第一重遍历所有元素,第二重遍历时与第一重的数字对比,重复一次不管,多余一次重复删除。

遇到问题:
  每次remove数组中的重复元素后,数组长度变短,会导致数组越界行为,没想到好的解决办法,于是参考。

值得注意:
  题目中要求的是原数组nums发生改变,用新的空数组生成会报错。
'''
以下为错误示例:
'''
  class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        result = []
        if len(nums) <= 1:
            return 0
        else:
            nums.sort()
            for i in nums:
                if i not in result:
                    result.append(i)
                else:
                    continue
            return result

 以下为两种正确解法,均能解决我数组越界的疑问: 

# 解法1
‘’‘
 越界:用到python enumerate()函数,数组角标与值一对一,debug观察del元素后,角标与值对应关系不改变,因此不存在数组越界问题。
 思路:设置数组第一位为标志位,从第二位开始对比,相同则删除,不同则将标志位后移,直到全部遍历。
’‘’
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums) == 0:
            return 0
        if len(nums) == 1:
            return 1
        temp = nums[0]
        count = 0
        for index, num in enumerate(nums[1:]):
            if temp == num:
                del nums[index - count]
                count += 1
            else:
                temp = num
        print(nums)
        return len(nums)
# 解法2
‘’‘
 越界:看了评论区一个大兄弟的解法,巧妙设置了一个j,保证标志位和pop的位置始终相邻,同样解决了数组越界的问题。
 思路:设置数组第一位为标志位,从第二位开始对比,相同则将该元素pop出数组,下次利用j仍比较pop执行后的标志位的相邻位,直到遇到不同元素,则将标志位后移,再重复步骤。
’‘’
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if not nums:
            return 0
        temp = nums[0]
        j = 1
        for i in range(1, len(nums)):
            i = j
            if temp != nums[i]:
                temp = nums[i]
                j += 1
            else:
                nums.pop(i)
        print(nums)
        return len(nums)

基础确实差,学习了,再遇到存在数组越界的问题,会从这两方面考虑解决。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值