LeetCode WIith JS || 88. Merge Sorted Array[合併有序數組]

題目描述:

  Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

  Note:
  You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.

大白話:

  合併兩個有序的數組

  原題目鏈接:88. Merge Sorted Array

思路:

  以數組[1,4,5]和[1,2,8,9]爲例子;
 這裏寫圖片描述
  我們知道合併後的數組總的有效數目爲m+n,因爲都是從0開始,所以nums1和nums2的最後一個元素的索引分別是m-1和n-1,合併後的nums1的最後一個元素的索引應該是m+n-1。
  
  我們在數組nums1中設p從尾部開始索引[即從確定大數開始],在m和n的數組中i和j也是從尾部大數開始索引,nums1[i]和nums2[j]比較下誰大誰就去填補p指引的那個位置,誰去填補了i或者j就往左邊移動。

AC代碼如下:

var merge = function(nums1, m, nums2, n) {
    if(m ==0&&n==0) return;
    if(m==0&&n!=0){
        for(var i = 0;i<n;i++){
            nums1[i]=nums2[i];
        }
    }

    if(m!=0&&n!=0){
        var i = m-1, j = n-1, p = m+n-1;
        while(j>=0&&i>=0){
            if(nums1[i]>nums2[j]){
                nums1[p] = nums1[i];
                i--;
            }else{
                nums1[p] = nums2[j];
                j--;
            }
            p--;
        }

        while(i>=0){//nums1長些
            nums1[p] = nums1[i];
            i--;
            p--;
        }
        while(j>=0){
            nums1[p] = nums2[j];
            j--;
            p--;
        }
    }
    return nums1;
};

其實觀察以上代碼我們還可以精簡

var merge = function(nums1, m, nums2, n) {
    if(m ==0&&n==0) return;
    if(m==0&&n!=0){
        for(var i = 0;i<n;i++){
            nums1[i]=nums2[i];
        }
    }

    if(m!=0&&n!=0){
        var i = m-1, j = n-1, p = m+n-1;
        //while(j>=0&&i>=0){
        while(j>=0){
            //if(nums1[i]>nums2[j]){
             if(nums1[i]>nums2[j]&&i>=0){
                nums1[p] = nums1[i];
                i--;
            }else{
                nums1[p] = nums2[j];
                j--;
            }
            p--;
        }

        // while(i>=0){//nums1長些
        //     nums1[p] = nums1[i];
        //     i--;
        //     p--;
        // }
        // while(j>=0){
        //     nums1[p] = nums2[j];
        //     j--;
        //     p--;
        // }
    }
    return nums1;
};

更精簡的:

var merge = function(nums1, m, nums2, n) {
    var i = m - 1, j = n - 1, position = m + n - 1;
    while (j >= 0) {
       nums1[position--] =
       ( i >= 0 && nums1[i] > nums2[j] ) ? nums1[i--] : nums2[j--];
    }
    return nums1;
};

over

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章