1. 程式人生 > >leetcode 合併兩個有序陣列

leetcode 合併兩個有序陣列

給定兩個有序整數陣列 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] 題目不難,第一種思路是設一個新的陣列,長度為m+n,然後注意的將nums1和nums2陣列比較,小的元素放入新的陣列中,最後將新的陣列copy到nums1中 程式碼:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
       int []nums = new int[m+n];
       int i = 0,j = 0,k = 0;
        while(i<m && j<n){
            if(nums1[i]<=nums2[j]){
                nums[k] = nums1[i];
                i++;
                k++;
            }
            if(nums1[i]>nums2[j]){
                nums[k] = nums2[j];
                j++;
                k++;
            }
        }
        while(i<m){
             nums[k] = nums1[i];
                i++;
                k++;
        }
         while(j<n){
              nums[k] = nums2[j];
                j++;
                k++;
         }
        for(int l = 0;l<k;l++){
            nums1[l] = nums[l];
        }
    }   
}

程式碼比較理解起來比較簡單,不多說了,但是是不是還有更簡便的演算法呢? 如果我們從兩個有序陣列最後一個元素開始比較,較大的放入nums1陣列的m+n-1元素中, 然後索引後移,再將較大的放入m+n-2元素中,這樣下去就產生兩種情況, 第一種,就是nums1的所有元素被比較完了,直接將nums2裡的元素copy到nums1裡就可以了 第二種,nums2裡的所有元素被比較完了,由於兩陣列之前都是有序的,所以合併就完成了。 程式碼:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
     int k = m+n-1;
    --m;--n;
    while(m>=0 && n>=0) nums1[k--] = nums1[m] > nums2[n] ? nums1[m--]:nums2[n--];
    while(n>=0) nums1[k--] = nums2[n--];
    }
}

後一種方法我也是看到一位大佬的部落格寫的,一時找不到這位大佬的連結啦,哈哈,在這裡謝謝大佬啦