尋找兩個有序數組的中位數
問題描述
詳情可見LeeCode第四題
給定兩個大小爲 m 和 n 的有序數組 nums1 和 nums2。
請你找出這兩個有序數組的中位數,並且要求算法的時間複雜度爲 O(log(m + n))。
你可以假設 nums1 和 nums2 不會同時爲空。
解題思路
思路:
1. 時間複雜度爲O(log(m+n))可聯想到要用二分查找。
2. 找到(m+n+1)和(m+n+2)的兩個數,並求出平均值,即爲中位數。
主函數
- 得到參數right和left。
- 遞歸求出(m+n+1)和(m+n+2)的平均值。
遞歸函數
- 邊界條件判定一:若一組爲空,則用另一組。
- 邊界條件判定二:如果k==1,則取兩數組最小的頭元素。
- 二分查找
解題代碼
class Solution{
public double findMedianSortedArrays(int[] nums1, int[] nums2){
int m = nums1.length;
int n = nums2.length;
int left = (m+n+1)/2;
int right = (m+n+2)/2;
return (findKth(nums1, 0, nums2, 0, left)+findKth(nums1, 0, nums2, 0, right))/2.0;
}
public int findKth(int[] nums1, int i, int[] nums2, int j, int k){
if(i>=nums1.length) return nums2[j+k-1];
if(j>=nums2.length) return nums1[i+k-1];
if(k==1){
return Math.min(nums1[i], nums2[j]);
}
int midVal1 = (i+k/2-1<nums1.length)?nums1[i+k/2-1]:Integer.MAX_VALUE;
int midVal2 = (j+k/2-1<nums2.length)?nums2[j+k/2-1]:Integer.MAX_VALUE;
if(midVal1<midVal2){
return findKth(nums1, i+k/2, nums2, j, k-k/2);
}else{
return findKth(nums1, i, nums2, j+k/2, k-k/2);
}
}
}