1. 程式人生 > >leetcode演算法題4: 尋找兩個有序陣列的中位數

leetcode演算法題4: 尋找兩個有序陣列的中位數

題目:給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2

請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 O(log(m + n))。

你可以假設 nums1 和 nums2 不會同時為空。

示例 1:nums1 = [1, 3] nums2 = [2],  則中位數是 2.0

示例 2:nums1 = [1, 2] nums2 = [3, 4] ,則中位數是 (2 + 3)/2 = 2.5

解析:兩個陣列分別採用二分法查詢。如下示例:

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int length1 = nums1.length;
        int length2 = nums2.length;
        int lengthall = length1 + length2;
        int l = (lengthall+1)/2;
        int r = (lengthall+2)/2;
 
        return (getKMin(nums1,0,nums2,0,l)+getKMin(nums1,0,nums2,0,r))*1.0/2;  
    }
    
     public static int getKMin(int[] A, int Astart, int[] B, int Bstart, int k){
        if (Astart>A.length-1){
            return B[Bstart + k -1];
        }
        if (Bstart>B.length-1){
            return A[Astart + k -1];
        }
        if (k==1){
            return Math.min(A[Astart],B[Bstart]);
        }
 
        int Amin = Integer.MAX_VALUE,Bmin = Integer.MAX_VALUE;
        if (Astart + k/2 -1 < A.length){
            Amin = A[Astart + k/2 -1];
        }
        if (Bstart + k/2 -1 < B.length){
            Bmin = B[Bstart + k/2 -1];
        }
 
        return Amin < Bmin ? getKMin(A,Astart + k/2, B, Bstart,k-k/2):getKMin(A,Astart,B,Bstart+k/2,k-k/2);
    }

}

複雜度分析

  • 時間複雜度:O(log(m+n))