88. Merge Sorted Array
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
The number of elements initialized in nums1 and nums2 are m and n respectively.
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2
Example:
Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]解法
要求原地合并,列表 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.
"""
i = m - 1 # current locatin for nums1
j = n - 1 # current locatin for nums2
for k in range(len(nums1))[::-1]:
if i < 0: # nums1 is all out
nums1[k] = nums2[j]
j -= 1
elif j < 0: # j is all out, all the job should done
break
elif nums1[i] > nums2[j]:
nums1[k] = nums1[i]
i -= 1
else:
nums1[k] = nums2[j]
j -= 1
# another for loop
m = m - 1
n = n - 1
for k in range(len(nums1)):
if n < 0:
break
if m < 0:
nums1[:n+1] = nums2[:n+1]
break
elif nums1[m] > nums2[n]:
nums1[~k] = nums1[m]
m -= 1
else:
nums1[~k] = nums2[n]
n -= 1一个一行解法:
因为是把 nums2 合并到 nums1,所以当 nums2 的元素都添加到 nums1 中适当位置的时候,原本的 nums1 中的元素本身有序,此时整个列表有序,这是循环终止的条件。当前处理元素的位置可以由 m + n - 1 取到,即剩余元素总个数减 1 就是当前位置的索引。
展开来写就是:
小结
Python 负数补码显示
i 和 ~i
Python 使用 For 循环反向遍历可迭代对象
列表使用切片原地赋值
引用
Last updated
Was this helpful?