4. Median of Two Sorted Arrays


June-22-2019

这个题做得那叫一个烂。。

找2个数组的中位数:
先找到每个数组的1/4位数然后比较:较小数组里到中位的部分可以舍弃.
这里其实已经把范围缩小到2个数组分别的0~k/4
下一次计算就要找到2个数组的0~k/8,这样下去总能找到

然后, 这个人是可以普及到Kth smalleast number in 2 arrays (or even N arrays), 这里做的是kth in 2 sorted arrays.

这个题烦在edge case比较多:
medium可以是1个,也可以是2个数的平均数,题里已经说了。
因为用了kth smallest, 传进去的是index,要相应+1, -1,很容易弄错。比如一开始传入的是length / 2 + 1,5个数的话第三个是中位数,k = 3。里面计算的时候k-1,因为第三大的数index=2.
如果其中一个超边界了,说明要找的值在另一个数组里,直接拿就行。

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int length = nums1.length + nums2.length;
        
        if (length % 2 == 1) {
            return kthLargest(nums1, nums2, 0, 0, length / 2 + 1);
        } else {
            return (kthLargest(nums1, nums2, 0, 0, length / 2) + kthLargest(nums1, nums2, 0, 0, length / 2 + 1))/2.0;
        }
    }
    
    public double kthLargest(int[] nums1, int[] nums2, int l1, int l2, int k) {
       
        if (l1 >= nums1.length) {
            return nums2[l2 + k - 1];
        }
        if (l2 >= nums2.length) {
            return nums1[l1 + k - 1];
        }
        
        if (k == 1) {
            return Math.min(nums1[l1], nums2[l2]);
        }
        
        int indexOfKthFor1 = l1 + k / 2 - 1;
        int indexOfKthFor2 = l2 + k / 2 - 1;
        
        int val1 = indexOfKthFor1 < nums1.length ? nums1[indexOfKthFor1] : Integer.MAX_VALUE;
        int val2 = indexOfKthFor2 < nums2.length ? nums2[indexOfKthFor2] : Integer.MAX_VALUE;
        
        
        
        if (val1 > val2) {
            return kthLargest(nums1, nums2, l1, indexOfKthFor2 + 1, k - k / 2);
        } else {
            return kthLargest(nums1, nums2, indexOfKthFor1 + 1, l2, k - k / 2);
        }
 
    }
}
posted @ 2019-06-23 13:45  哇呀呀..生气啦~  阅读(102)  评论(0编辑  收藏  举报