标签:return Arrays kthLargest Median int length Sorted nums1 nums2
刷
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);
}
}
}
标签:return,Arrays,kthLargest,Median,int,length,Sorted,nums1,nums2 来源: https://www.cnblogs.com/reboot329/p/11072516.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。