leetcode演算法題4: 尋找兩個有序陣列的中位數
阿新 • • 發佈:2018-11-24
題目:給定兩個大小為 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))