20合并两个有序数组
2020-07-28 本文已影响0人
Jachin111
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
辨析:nums1 = A 和 nums1[:] = A 的不同之处:
nums1 = A # 更改 nums1 这一变量名所指向的对象。让 nums1 变量指向 A 所指向的对象
nums1[:] = A # 对 nums1 指向的对象赋值。把 A 变量指向的对象的值逐个 copy 到 nums1 指向的对象中并覆盖 nums1 指向的对象的原来值。
nums1[:] 等价于 nums1[0:len(nums1)] 相当于取 nums1 对应的对象的一个视图,通常用这个来改变原对象的某几位值。
比如有时候,我们用 A[:2] = [0,1], 来改变 A 所指向的 list 对象的前两个值。
而如果用 A = [0,1], 则是让 A 这一变量名指向新的 list 对象 [0,1]
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.
"""
if 0 == n:
pass
elif 0 == m:
nums1[:n] = nums2[:n]
else:
a, b = m-1, n-1
k = m+n-1
while (a>=0) and (b>=0):
if nums1[a]<=nums2[b]: # nums1 的元素尽量少动
nums1[k] = nums2[b]
k -= 1
b -= 1
else:
nums1[k] = nums1[a]
k -= 1
a -= 1
if (a>=0):
pass
if (b>=0):
nums1[k-b:k+1] = nums2[:b+1] # 必然有 k-b == 0,因为剩下的是最小的,必然是copy到最前面
双指针,从后向前
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.
"""
end=m+n-1
end_1=m-1
end_2=n-1
while(end_1>=0 and end_2>=0):
if(nums1[end_1]>=nums2[end_2]):
nums1[end]=nums1[end_1]
end_1-=1
end-=1
else:
nums1[end]=nums2[end_2]
end_2-=1
end-=1
nums1[:end_2+1]=nums2[:end_2+1]
来源:力扣(LeetCode)