LeetCode之88. 合併兩個有序數組

概要

題目來源鏈接:https://leetcode-cn.com/problems/merge-sorted-array/

難度:簡單

類型:數組

題目

給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成爲一個有序數組。

說明:

初始化 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]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-sorted-array
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

分析

第一種算法,暴力破解,借用了單鏈表歸併遞增的思路。通過兩個指針i和j分別掃描數組nums1和nums2,比較nums1[i]和nums2[j]的值,將小的數保存到結果數組中,如果nums1[i]>nums2[j]那麼保存nums2[j],如果nums1[i]<nums2[j]那麼保存nums1[i],對應的指針都要增加,可能兩個數組中會存在未參與比較的值,那麼這些值比現有的結果數組的值都大,所以直接添加到結果數組result中即可。

第二種算法,思路是首先將nums1和nums2融合,即當作一個數組處理。然後遍歷nums1數組中的原nums2的元素,將其與原nums1的元素作比較,如果nums2的比較小則交換兩個元素的位置,最後即爲所得。

代碼

Java代碼

第一種算法:暴力破解

    /**
     * 合併兩個有序數組
     *
     * @param nums1 有序整數數組
     * @param m     初始化nums1的元素數量
     * @param nums2 有序整數數組
     * @param n     初始化nums2的元素數量
     */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int result[] = new int[m + n];// 創建一個新數組來放置合併後的結果
        int i = 0, j = 0, k = 0;
        while (i < nums1.length - n && j < nums2.length) {
            if (nums1[i] < nums2[j]) {// 比較兩個數組中的元素值,如果num1[i]小
                result[k] = nums1[i];// 那麼將nums[i]保存到result結果數組中
                i++;// nums1的指針加1
                k++;// result的指針加1
            } else {// 如果nums1[i]大於等於的話nums2[j]的話
                result[k] = nums2[j];// 就將小的數即nums2[j]保存到結果數組result中
                j++;// nums2的指針加1
                k++;// result的指針加1
            }
        }
        while (i < nums1.length - n) {// 將nums1數組中剩下的全部添加到結果數組result中
            result[k] = nums1[i];
            i++;
            k++;
        }
        while (j < nums2.length) {// 將nums2數組中剩下的全部添加到結果數組result中
            result[k] = nums2[j];
            j++;
            k++;
        }
        for (int q = 0; q < result.length; q++) {// 再將result數組的值賦給nums1
            nums1[q] = result[q];
        }
    }

第二種算法:

    /**
     * 合併兩個有序數組(第二種算法)
     *
     * @param nums1 有序整數數組
     * @param m     初始化nums1的元素數量
     * @param nums2 有序整數數組
     * @param n     初始化nums2的元素數量
     */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // 將num2合併到num1中
        int j=0;
        for (int i = m; i < nums1.length; i++) {// 循環將nums2的值添加到nums1數組中,當成一個數組來處理
            nums1[i]=nums2[j];
            j++;
        }
        for(int i=m;i<nums1.length;i++){// 循環遍歷nums1數組中的屬於nums2的元素
            for(int q=0;q<i+1;q++){// 循環遍歷nums1數組中的屬於nums1的元素
                if(nums1[i]<nums1[q]){// 比較兩個的值,如果nums1[i]<nums1[q]即nums2中的元素小於nums1中的元素,那麼交換二者的值
                    int temp=nums1[i];// 交換nums1[i]和nums1[q]
                    nums1[i]=nums1[q];
                    nums1[q]=temp;
                }
            }
        }
    }

 

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