刷
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);
}
}
}