【私用-靈感】LeeCode

尋找兩個有序數組的中位數

問題描述

詳情可見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);
        }
    } 
}

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