給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明:
初始化 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]
看到此題我們能想到的思路有兩種:
1.因為nums1有足夠的空間,所以直接將nums2放入nums1然後再進行排序。
**如下:
方法一:
1方法二:void merge(int nums1, int m, int nums2, int
n) 7
8intk;9
intl;
10int
tmp;
11for(k=0;k//
氣泡排序
12for(l=k+1;l)
13if(nums1[k]>nums1[l])18}
22 }
23 public static void main(string args)
36 }
1結果如下:從上面的**中我們可以看到先將nums2放入nums2,然後再排序。方法一相當與用了兩次雙重迴圈,時間複雜度是否優點大呢??而且這樣是否浪費了題意呢??那再讀一遍題:給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。有沒有更好一點解決辦法呢?當然有:public
static
void merge(int nums1, int m, int nums2, int
n)
8 m++; //
移向nums1的下乙個元素
9for(int k = m - 1;k > j;k--)
12 nums1[j] = tem; //
nums2放入當前找到的位子
13} 14}
1516
public
static
void
main(string args) ;
18int nums2 = ;
1920 merge(nums1,3,nums2,3);
21for(int k = 0;k < nums1.length;k++)
2425 }
2.我們先申請乙個有m+n 大的陣列,將nums1和nums2同時往新的陣列裡面放,因為他們都是有序的,所以就判斷然後加就好了,這樣就會避免雙重迴圈給的複雜度太高,而且不「浪費題意」。我們看**。
**如下:
方法三:
1結果如下:void merge(int nums1, int m, int nums2, int
n) 13
if ( i < m)
17if (j < n)
21 system.arraycopy(nums,0,nums1,0,nums.length - n); //
給nums1賦去
22 }
23 public static void main(string args) ;
25 int nums2 = ;
26
27 merge(nums1,3,nums2,3);
28 for(int k = 0;k < nums1.length;k++)
31 }
從上面的**中,我們可以看到它很巧妙的用到了nums1和nums2是有序的條件。而且最後也將最終的新的陣列nums賦給了nums1也是實現了假定nums1有m+n大的空間,可以合併nums1和nums2了。
合併兩個有序陣列
例如 陣列a1 陣列a2 則合併為a3 思路 依次掃瞄a1和a2的元素 比較當前元素的值,將較小的元素賦給a3,直到乙個陣列掃瞄完畢,然後將另乙個陣列的剩餘元素賦給a3即可。陣列a3的容量需要容納a1和a2兩個陣列和長度和。實現 include include void merge int a1,i...
合併兩個有序子陣列
設子陣列a 0 k 1 和a k,n 1 已經排好序 0 k n 1 設計乙個合併這兩個子陣列的排序好的陣列a 0 n 1 的 演算法。要求演算法最壞情況下所用的計算時間為o n 且只用到o 1 的輔助空間。解答此題可以用向右 左 迴圈換位合併的思想,先用二分搜尋查詢a 0 在陣列a k n 1 中...
合併兩個有序陣列
給定兩個有序整數陣列 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 class solution def merge s...