給你兩個有序整數陣列 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]
-10^9 <= nums1[i], nums2[i] <= 10^9
nums1.length == m + n
nums2.length == n
#最直觀的思路
設l1/l2分別代表兩個列表當前所遍歷到的位置
insert表示已經插入成功的數字個數
首先判斷n是否為0,如果為0,則不需要修改nums1,直接跳過即可
若m為0,則直接將nums2的值全部賦予給nums1
(注意這裡使用nums1[:]而不是nums1
我們需要辨析:nums1 = a 和 nums1[:] = a 的不同之處:
nums1 = a # 更改 nums1 這一變數名所指向的物件。讓 nums1 變數指向 a 所指向的物件
nums1[:] = a # 對 nums1 指向的物件賦值。把 a 變數指向的物件的值逐個 copy 到 nums1 指向的物件中並覆蓋 nums1 指向的物件的原來值。
詳情可以檢視:
若m和n都不為0,則開始進行遍歷兩個列表
第一句判斷 nums2[l2]是否小於等於nums1[l1],同時l1是否小於m + insert,
若滿足,則將nums2[l2]插入到nums1[l1]的位置。同時l1/l2/insert都自加1
若不滿足,則只有l1自加1。(這代表當前nums1[l1]位置的數小於nums2[l2])
l1 >= m + insert 這句話是判斷nums1中的數字是否已經遍歷完畢,
如果nums1已經遍歷完畢,但是nums2中的數字卻沒有遍歷完畢,
則需要直接將nums2中沒遍歷過的數字直接插入到nums1中即可。
最後一步是提出原來nums1末尾的0
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.
""" l1 = 0
l2 = 0
insert = 0
if n == 0:
pass
elif m == 0:
nums1[:]
= nums2
else:
while l2 < len(nums2):
if nums2[l2]
<= nums1[l1] and l1 < m + insert:
nums1.insert(l1, nums2[l2]
) l2 += 1
l1 += 1
insert += 1
else:
l1 += 1
if l1 >= m + insert:
nums1.insert(l1, nums2[l2]
) l2 += 1
# print (nums1)
nums1[:]
= nums1[:len(nums1) - n]
return nums1
Evan的LeetCode刷題之路
二 資料庫 以此記錄本人的leetcode刷題之路。題目內容均 於leetcode 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2...
leetcode刷題之路38 報數
報數序列是乙個整數序列,按照其中的整數的順序進行報數,得到下乙個數。其前五項如下 1.1 2.11 3.21 4.1211 5.111221 1 被讀作 one 1 乙個一 即 11。11 被讀作 two 1s 兩個一 即 21。21 被讀作 one 2 one 1 乙個二 乙個一 即 1211。給...
朝花夕拾 LeetCode刷題合輯
20220228 1601.最多可達成的換樓請求數目 方法一 dfs 列舉 列舉所有換樓請求的選擇與不選擇兩種情況,最後判斷是否滿足題意,時間複雜度為 o 2 m m 為請求個數,依題意 m 16,符合要求。1 include 2 3const int n 25 4 5class solution ...