【leetcode每日刷題】4. Median of Two Sorted Arrays

https://leetcode.com/problems/median-of-two-sorted-arrays/

 

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        //中間的兩個數,如果是奇數算兩次
        int left = (len1+len2+1)/2; 
        int right = (len1+len2+2)/2;
        return (getKth(nums1, 0, len1-1, nums2, 0, len2-1, left)+
                getKth(nums1, 0, len1-1, nums2, 0, len2-1, right)) * 0.5;
    }
    public int getKth(int[] nums1, int start1, int end1, int[] nums2, int start2, int end2, int k){
        int len1 = end1 - start1 + 1;
        int len2 = end2 - start2 + 1;
        // 讓len1始終小於len2
        if(len1 > len2) return getKth(nums2, start2, end2, nums1, start1, end1, k);
        // 如果最小的len等於0,則中位值肯定在nums2中
        if(len1 == 0) return nums2[start2 + k - 1];
        // 如果是第1個數,返回最小的
        if(k == 1) return Math.min(nums1[start1], nums2[start2]);
        // 每次排除k/2個數
        int i = start1 + Math.min(len1, k/2) - 1;
        int j = start2 + Math.min(len2, k/2) - 1;
        // 如果nums1中第k/2個數大,則截取nums2的一半,否則,相反
        if(nums1[i] > nums2[j]) return getKth(nums1, start1, end1, nums2, j+1, end2, k-(j-start2+1));
        else return getKth(nums1, i+1, end1, nums2, start2, end2, k-(i-start1+1));
    }
}

 

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