leetcode刷题笔记Day3

leetcode刷题笔记Day3

1、删除有序数组中的重复项

题目描述:

给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k

示例:

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

解法一:直接法

思路:

1、用pre记录当前不一致的值,初始值为数组第一个数字,k为不一样元素个数,初始值为0

2、遍历后续元素,当与pre不一致时,说明遇到了下一个不一样的值,k值+1,并且将该值更新入nums[k]位置,以及修改pre的值;

3、直至数组遍历完

4、类似双指针,k可看作是新数组的索引指针,i可看作是原数组的索引指针

代码:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        k = 0
        length = len(nums)
        if not nums:
            return 0
        pre = nums[0]# 不一致元素
        for i in range(1,length):
            if nums[i] != pre:
                k += 1
                pre = nums[i]
                nums[k] = pre# 更新nums数组
        return k+1# 漏掉了最开始的那个值

结果:

在这里插入图片描述

注意:

a=[1,2,3,4,5,6,7,8,9,10]
for i in range(0,len(a)):
    a.pop(i)
    print(a)

报错,错误信息:IndexError: pop index out of range

原因:

在Python中,list.pop()是一个方法,它用于移除列表的最后一个元素。list.pop(index)是另一个方法,它用于移除列表中特定索引的元素。

原因是a.pop(i)会移除索引为i的元素。在第一次循环中,当i=0时,a.pop(i)会移除列表的第一个元素。然后,列表中的所有元素都会向前移动一个位置,导致后续的元素索引发生变化。

解法二、优化

思路:

1、若出现[0,1,2,3,4]这种情况,每次比较都不一致,每次都须复制更新pre以及nums数组,这并不划算;

2、因此,我们可以增加一个判断条件,如果k和i相差小于1,代表我们无需更新nums数组

代码:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        length = len(nums)
        if not nums:
            return 0
        pre = nums[0]
        k = 0
        for i in range(1,length):
            if nums[i] != pre:
                k += 1
                pre = nums[i]
                if i-k >= 1:# 无需更新数组
                    nums[k] = pre
        return k+1

结果:

在这里插入图片描述

相关知识介绍

assert

定义:

Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况。

用法:

assert expression
# 等价于
if not expression:
    raise AssertionError

2、移除元素

题目描述:

给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

解法一、直接求解

思路:

1、与上一题的解法原理相同

代码:

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

结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值