题目描述:
思路:
朴素
:
归并排序
,
合并两数组
朴素:\\归并排序,合并两数组
朴素:归并排序,合并两数组
快速查询
:
中位数相当于查询中间的那
1
/
2
个数
利用快速排序思想的快速查询
可以在
l
o
g
的时间内解决
快速查询:\\中位数相当于查询中间的那1/2个数\\利用快速排序思想的快速查询\\可以在log的时间内解决
快速查询:中位数相当于查询中间的那1/2个数利用快速排序思想的快速查询可以在log的时间内解决
代码:
//利用快速查询算法,查询第k个数
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int length = nums1.length + nums2.length;
if(length % 2 == 1) {
return getKth(nums1, 0, nums2, 0, (length + 1) >> 1);
}else {
return (getKth(nums1, 0, nums2, 0, (length >> 1)) + getKth(nums1, 0, nums2, 0, (length >> 1) + 1)) / 2.0;
}
}
private int getKth(int[] nums1, int start1 , int[] nums2, int start2, int k) {
int length1 = nums1.length - start1;
int length2 = nums2.length - start2;
if(length1 > length2) {
return getKth(nums2, start2, nums1, start1, k);
}else {
if(length1 == 0) {
return nums2[start2 + k - 1];
}
if(k == 1) {
return Math.min(nums2[start2], nums1[start1]);
}
int tempStart1 = start1 + Math.min(length1,k/2) - 1;
int tempStart2 = start2 + Math.min(length2,k/2) - 1;
if(nums1[tempStart1] > nums2[tempStart2]) {
return getKth(nums1, start1, nums2, tempStart2 + 1, k-(tempStart2 - start2 + 1));
}else {
return getKth(nums1, tempStart1 + 1, nums2, start2, k-(tempStart1 - start1 + 1));
}
}
}
}