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
结果: