题目一:合并有序数组
给你两个按递增顺序 排列的整数数组 nums1和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你合并 nums2到 nums1 中,使合并后的数组同样按递增顺序排列。
关键数据结构:
List[]一维列表
关键方法:
.append();.sort()排序
关键思路:
nums1和nums2本身都是递增排序的,最简单的方法是直接把nums2中的元素合并到nums1中,然后使用.sort()方法对列表进行递增排序;
另外一种方法是双指针中的快慢指针法,用两个指针分别指向两个列表的头部,逐个比较元素大小,小的就放到新的列表中,然后指针右移动
//法一:直接使用python中的sort()方法对合并后的数组排序
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
nums1[m:] = nums2
nums1.sort()
//法二:使用快慢指针,逐个遍历两个列表中的元素,然后把小的放到新表中
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
sorted = []
p1,p2=0,0
while p1 < m or p2 <n:
if p1 == m:
sorted.append(nums2[p2])
p2+=1
elif p2 == n:
sorted.append(nums1[p1])
p1+=1
elif nums1[p1]<nums2[p2]:
sorted.append(nums1[p1])
p1+=1
else:
sorted.append(nums2[p2])
p2+=1
nums1[:] = sorted
//这里需要注意,如果直接写nums1=sorted,提交是会报错的;因为nums1作为传参,nums1=sorted并不改变其原地址上存储的值,而[:]方法会改变其原地址上的值
题目二:移除元素
给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于 val的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
- 更改
nums数组,使nums的前k个元素包含不等于val的元素。nums的其余元素和nums的大小并不重要。 - 返回
k。
关键数据结构:
List[]一维列表
关键方法:
.remove();快慢指针
关键思路:
方法一:使用python中的remove方法可以直接把nums中的val元素去除掉,然后测量nums数组的长度k。remove方法是逐个进行删除的,所以需要与while循环搭配使用
方法二:快慢指针。用两个指针指向列表头部,一个指针用来遍历初始列表,另一个指针用来标识不含元素val的新列表
//法一:直接用python中的remove()方法,移除指定元素后对统计列表长度即可
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
while val in nums:
nums.remove(val)
return len(nums)
//法二:快慢指针。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
k=0
for i in range(len(nums)):
if nums[i] != val:
//下标i对应的列表是旧的列表,下表k对应的列表是把非val元素放在前面的新表
//最后只需要返回k即可
nums[k]=nums[i]
k +=1
return k
题目三:删除有序数组中的重复项
给你一个 非严格递增排列 的数组 nums ,请你**原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k。去重后,返回唯一元素的数量 k。
nums 的前 k 个元素应包含 排序后 的唯一数字。下标 k - 1 之后的剩余元素可以忽略。
关键数据结构:
List[]列表
关键思路:
快慢指针。同样的定义两个指针,快指针用于遍历整个列表,查找不重复元素;慢指针用于存储不重复元素,并把其覆盖在原列表上。所谓原地删除其实就是用新的元素把旧的元素覆盖,原地删除就是覆盖
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
fast,low = 1,1
n = len(nums)
while fast < n:
//快指针用于遍历列表中的每个元素,并查找出不重复元素
if nums[fast]!=nums[fast-1]:
//慢指针来把不重复元素覆盖到原列表上
nums[low]=nums[fast]
low+=1
fast+=1
//返回不重复元素个数
return low
题目四:删除有序数组中的重复项之二
给你一个有序数组 nums ,请你**原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
关键数据结构:
列表List[]
关键思路:
本题的思路和上一题是一样的,同样可以使用快慢指针,由于列表本身是有序的,判断一个元素是否出现超过两次,直接使用num[i-2]==num[i]即可,快指针用于遍历每个元素并查找重复出现两次以上元素,慢指针作为新列表的下标,将其存储起来并覆盖原列表
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
n = len(nums)
if n<=2:
return n
slow,fast =2,2
while fast <n:
if nums[slow-2]!=nums[fast]:
nums[slow]=nums[fast]
slow+=1
fast+=1
return slow
//本题和上一道题目的关键区别在于判断条件:nums[slow-2]!=nums[fast]
//上一题为:nums[fast-1]!=nums[fast]
//由于本题目要求的是新表中重复出现的数字可以出现至多两次,所以需要和有效表进行比对
//(机械记忆就好)