给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6]
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 []
合并结果是 [1]
示例 3:
输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1]
合并结果是 [1]
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。
from typing import List
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
# nums1 = nums1 + nums2
# nums1.sort()
# a = nums1[n:]
# print(a)
# return a
# 通过测试用例
# 3 / 59
# for i in range(len(nums1)):
# if nums1[i] == 0:
# for j in nums2:
# nums1[i] = j
# i += 1
# print(nums1)
# return nums1
# # 通过测试用例
# # 8 / 59
# """
# 将数组nums2放到nums1的尾部,然后直接怼整个数组进行排序
# 截取nums1的m位置后面的取值,并重新赋值为 nums2,重新赋值是在原列表上赋值的,所以可行
# """
# nums1[m:] = nums2
# nums1.sort()
"""
双指针:
利用nums1和2已经被排序的性质,2个指针,将两个队列的头部较小的数字放到结果中
如果 nums1 的第一个元素 小于 nums2 的第一个元素,则nums1[0]存入新列表,且 nums1 的指针后移一位
如果 nums1 的第一个元素 大于 nums2 的第一个元素,则nums2[0]存入新列表,且 nums2 的指针后移一位
first, second = 0, 0 # 给2个列表都定义一个指针
while first < y: # 开始从头遍历
条件逻辑
x += 1 # 符合条件了指针移动
"""
sorted = []
p1, p2 = 0, 0
while p1 < m or p2 < n:
if p1 == m: # 如果 nums1 的指针等于0的时候,把nums2的元素依次加入到数组中
sorted.append(nums2[p2])
p2 += 1
elif p2 == n: # 如果 nums2 的指针等于0的时候,把nums1的元素依次加入数组中
sorted.append(nums1[p1])
p1 += 1
elif nums1[p1] < nums2[p2]: # 如果 数组1 的指针位置元素 小于 数组2指针位置的元素,则数组1元素的加入新数组
sorted.append(nums1[p1])
p1 += 1
else:
sorted.append(nums2[p2]) # 如果 大于,则将 数组2元素 加入新数组
p2 += 1
nums1[:] = sorted
class TestSolution:
def test_three(self):
b = Solution()
b.merge(nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3)
def test_two(self):
b = Solution()
b.merge(nums1 = [1], m = 1, nums2 = [], n = 0)
def test_one(self):
b = Solution()
b.merge(nums1 = [0], m = 0, nums2 = [1], n = 1)
nums1[m:] = nums2
:给 nums1 的区间赋值,直接在原地修改的
num1[:] = nums2[::-1]
:反转数组