給你兩個有序整數陣列 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
很直接的就是雙指標掃瞄,與上次我們在鍊錶時寫過合併有序鍊錶同樣的通過掃瞄與大小比較最終掃瞄完兩個序列(m+n),前者是新建乙個頭節點然後遍歷過程中慢慢連。這邊也是可以建立乙個陣列,每掃瞄乙個往裡面設定值。有了思路之後理一下具體的過程:
**如下:
public void merge(int nums1, int m, int nums2, int n)
*/system.arraycopy(nums1, 0, nums1_copy, 0, m);
// 掃瞄兩個素材陣列的指標
int p = 0;
int q = 0;
// 結果陣列(num1)待設值位置的指標
int cur = 0;
// 2.挨個比較設值
while ((p nums1[cur++] = (nums1_copy[p] }
// 3.加入最後多餘的一段
if (p system.arraycopy(nums1_copy, p, nums1, p + q, m + n - p - q);
if (q system.arraycopy(nums2, q, nums1, p + q, m + n - p - q);
}
時間上的話看三組操作m+min(m,n)+(m-n)或(n-m)
因此為m+n,遍歷了兩組元素嘛o(m+n) 空間就是nums1_copy
也就是o(m)
解這題一開始我就在想是不是原地就可以(不用建立陣列),但如果在解法一的過程中把num2的值設過去,那邊就必須得存被替換的值。並且可能一直是num2小也是說那邊還是需要乙個中間陣列。
也就是為了那一塊的值建立了m大小的陣列,為什麼我們能拿num1為結果陣列?不就是它有空閒的一塊地方麼,那麼我們何必不用呢!反而另開一塊呢!直接用後面的地方不就不存在替換了嗎!
情況一:最終前面小的一塊在num1
情況一:最終前面小的一塊在num2
**如下:
public void merge(int nums1, int m, int nums2, int n)
// 2.可能nums2前面有餘
system.arraycopy(nums2, 0, nums1, 0, q + 1);
}
時間複雜度仍然是不可避免的o(m+n) 空間複雜度o(1)
這題還是比較簡單的,主要是考慮到新增快取與當前空間的問題。很多時候我們的中間變數或者中間陣列是否真的該加。場上是否有不用的空間不用的變數,這是我們需要考慮的!剔除冗餘無效**
88 合併兩個有序陣列
略。知道是在nums1上變動。如果從nums1的頭部開始放,就會出現nums1緊接著的第乙個元素還沒有nums2從頭數第二個元素小的情形,這樣就沒有辦法比較了。而從nums1的最後乙個元素開始放,能夠保證nums1和nums2的最後乙個元素一定比彼此的倒數第二個元素大。所以選擇從nums1的最後乙個...
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 思路 建乙個新的陣列nums,長度為m n 用乙個fo...
88 合併兩個有序陣列
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素。示例 輸...