尋找兩個正序陣列的中位數問題,方法一:合併陣列檢索法

星海無邊發表於2020-12-11

題目:

給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的中位數。
示例 1:

輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合併陣列 = [1,2,3] ,中位數 2
示例 2:

輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合併陣列 = [1,2,3,4] ,中位數 (2 + 3) / 2 = 2.5
示例 3:

輸入:nums1 = [0,0], nums2 = [0,0]
輸出:0.00000
示例 4:

輸入:nums1 = [], nums2 = [1]
輸出:1.00000
示例 5:

輸入:nums1 = [2], nums2 = []
輸出:2.00000

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/median-of-two-sorted-arrays

分析:

本題是一個陣列和中位數的問題,最容易想到的就是先合併兩個陣列,然後在合併的陣列中尋找到中位數。這裡注意一點,他這裡的數雖然都是整數,但是結果可能是有小數的(兩個中間數的情況取平均值),如果是int向下取整可能出錯,最好強轉一下(num1 + num2)/ 2.0來獲得浮點數結果。

程式碼:

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        //建立新陣列
        int[] a = new int[nums1.length + nums2.length];
        //i,j,k分別是nums1,nums2,a的遊標指示變數
        int i, j, k;
        i = j = k = 0;
        //將兩個陣列合併到新陣列中,歸併放入,利用他已經排好了序的屬性
        while(i < nums1.length && j < nums2.length){
            if(nums1[i] < nums2[j]){
                a[k ++] = nums1[i ++];
            }else{
                a[k ++] = nums2[j ++];
            }
        }
        //將剩下的也放入陣列中
        while(i < nums1.length) a[k ++] = nums1[i ++];
        while(j < nums2.length) a[k ++] = nums2[j ++];
        //找出中位數
        if((k % 2) == 1){
            return a[k/2];
        }else{
            //注意這裡可能是小數,要轉換
            return (a[k/2] + a[k/2 - 1]) / 2.0;
        }
    }
}

分析:

該演算法的時間複雜度是O(m+n),空間複雜度是O(m+n),思路比較直接,但還有待優化的地方,比如說這裡面的合併陣列是必須得到的嗎?可以不得到陣列而直接求出中位數嗎?

相關文章