天天看點

leetcode.88合并兩個有序數組合并兩個有序數組問題分析:代碼如下:解決方案:

合并兩個有序數組

給你兩個有序整數數組 nums1 和 nums2,請你将 nums2 合并到 nums1 中,使 nums1 成為一個有序數組。

初始化 nums1 和 nums2 的元素數量分别為 m 和 n 。你可以假設 nums1 的空間大小等于 m + n,這樣它就有足夠的空間儲存來自 nums2 的元素。

示例 1:

輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3

輸出:[1,2,2,3,5,6]

示例 2:

輸入:nums1 = [1], m = 1, nums2 = [], n = 0

輸出:[1]

問題分析:

對有序數組合并,從後往前依次放入nums1即可。如圖:

leetcode.88合并兩個有序數組合并兩個有序數組問題分析:代碼如下:解決方案:

若i>=0&&j>=0,此時兩個數組内元素比大小,大的放進去。

若j>=0,即數組nums1走完,此時直接将nums2完全放入nums1。

leetcode.88合并兩個有序數組合并兩個有序數組問題分析:代碼如下:解決方案:

若i>=0,即數組nums2走完,此時不動,nums1還是nums1。

leetcode.88合并兩個有序數組合并兩個有序數組問題分析:代碼如下:解決方案:

代碼如下:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int i=m-1;
    int j=n-1;
    int k=m+n-1;
    while(i>=0&&j>=0)
        nums1[k--]=nums1[i]>nums2[j]?nums1[i--]:nums2[j--];
    while(j>=0)
        nums1[k--]=nums2[j--];
}
           

解決方案:

這個做法是從後面開始确定的,還有其他方法可以做,有時間再寫出來。