思路:因為兩個陣列是有序的,因此可以在nums1
尾部插入乙個元素,再對左半部分進行掃瞄將插入的元素放在合適位置。
class
solution}}
public
void
exch
(int
a,int i,
int j)
}
思路:由於是歸併兩個有序陣列直接就可以想到歸併排序中的歸併操作,nums1
為輸出陣列,將nums1
、nums2
陣列中的值儲存到aux輔助陣列中,使用兩個指標i
、j
指向左半邊開頭與右半邊開頭,從左向右掃瞄,取左半邊與右半邊中較小的依次放入nums1中。
class
solution
}}
思路:每次從nums2
取出乙個元素,通過二分查詢查詢該元素在nums1
中的插入位置,將該位置及之後原有的的元素向後移動一位,給新元素騰位置,再將新元素插入。
class
solution
for(
int j = i; j > lo; j--
) nums1[lo]
= nums2[i-m];}
}public
void
exch
(int
a,int i,
int j)
}
上面**中空間復制度為o(m+n)可以繼續優化,只複製nums1
中的元素到乙個新陣列中
class
solution
if(i < m) system.
arraycopy
(nums1_copy, i, nums1, i+j, m+n-i-j);if
(j < n) system.
arraycopy
(nums2, j, nums1, i+j, m+n-i-j);}
}
上面**已經達到了最優的時間複雜度o(m+n),空間複雜度優化為了o(m),可以將指標指向陣列尾部從後往前遍歷,將較大的值放在nums1
尾部
class
solution
//補充nums2缺失的元素,nums1=[0],m=0,nums2=[1],n=1這種情況
system.
arraycopy
(nums2,
0, nums1,
0, j+1);}}
合併陣列時可以從後往前複製,這樣可以減少移動次數 leetcode 88 合併兩個有序數
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 示例 輸入 nums1 1,2,3,0,0,0 m 3 nums2 2,5,6 n 3 輸出 1,2,2,3,5,6 我覺得這道題有點問題。假設 nums1 有足夠的空間...
LeetCode 88 合併兩個有序陣列
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 示例 輸入 nums1 1,2,3,0,0,0 m 3 nums2 2,5,6 n 3 輸出 1,2,2,3,5,6 解題思路 使用二分查詢演算法直接插入,極其簡潔,展示...
leetcode88 合併兩個有序陣列
def merge self,nums1,m,nums2,n 關鍵點是nums1原陣列的長度是m n,肯定要在nums1上操作效率高 如果正向比較的話移動次數很多,逆向的話不需要移動 注意m,n是以1開頭的 while m 0 and n 0 if nums1 m 1 nums2 n 1 如果num...