leetcode題解-88. Merge Sorted Array

題解:給定兩個排序的整型數組nums1和nums2,將nums2合併到nums1成一個排序數組。你可以假設nums1中有足夠的空間(空間大於或等於m+n)來存放來自nums2的額外元素。nums1和nums2的初始空間分別是m和n。

分析:題目本身比較簡單,要求in-place處理數組,因此不能另外申請一個m+n的數組nums3。好在nums1有足夠的空間,但是如果從數組頭部開始merge的話,可能會覆蓋nums1中原來的元素。

因此,知道最終合併的長度爲m+n以後,從nums1的尾部開始merge,讀取nums1[m]和nums[n]的數值,比較誰大就把誰添加到nums1的m+n位,然後在逐步向前推進。

時間複雜度O(m+n),空間複雜度爲常數O(1)。

import java.util.Arrays;

class Solution {
    public static void merge(int[] nums1, int m, int[] nums2, int n) {
        int i = m - 1, j = n - 1;
        for(; i >= 0 && j >= 0;){

            if(nums1[i] > nums2[j]){
                nums1[i + j + 1] = nums1[i];
                i--;
            }else{
                nums1[i + j + 1] = nums2[j];
                j--;
            }  
        }
        // 需要注意,當上面循環結束時,nums2有可能還有元素沒有merge到nums1中,因此需要單獨處理一下。
        while(j >= 0){
            nums1[j] = nums2[j];
            j--;
        }
    }
    public static void main(String[] args) {
        int[] nums1 = {1,2,3,0,0,0,0};
        int[] nums2 = {4,5,6,7};
        merge(nums1, 3, nums2, 4);
        System.out.println(Arrays.toString(nums1));
    }
}
發佈了119 篇原創文章 · 獲贊 149 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章