Leetcode No.4两个排序数组的中位数
2020-12-28 19:35
首先明确思路 这题的解法我们可以采用一种递归的思想来解决问题
求他们的中位数,可以看成求这两个数组的合集的第k小的数 本文使用 mdnice 排版
两个有序数组的中位数
当 k = 1时,返回两个数组第一个值中的最小值即可
对于数组nums1,nums2,比较他们的第k / 2个数
nums1: a1,a2,...a(k / 2)..an
nums2: b1,b2....b(k / 2)...bm
若a(k / 2)
不难得出第k大的数必然不会出现在nums1的[1, k / 2]这个闭区间,反之亦然。
这里要注意一个边界条件:如果数组的长度取不到k/2,便要将其置为数组的最后一个数。class Solution {
public int help(int[] nums1, int start1, int end1, int[] nums2, int start2, int end2, int k){
int len1 = end1 - start1 + 1;
int len2 = end2 - start2 + 1;
//当数组一为空时,返回数组2第k小元素即可
if(len1 == 0)
return nums2[start2+ k - 1]; //k = 1, return nums2[start2] ... k = 2, return nums2[start2 + 1]
//当数组二为空时,返回数组1第k小元素即可
if(len2 == 0)
return nums1[start1 + k - 1]; //k = 1, return nums1[start1] ... k = 2, return nums1[start1 + 1]
if(k == 1)
return Math.min(nums1[start1], nums2[start2]);
int mid1 = start1 + Math.min(k / 2, len1) - 1;//避免数组越界
int mid2 = start2 + Math.min(k / 2, len2) - 1;
if(nums1[mid1] > nums2[mid2])//肯定不在nums2的[start2, mid2]
return help(nums1, start1, end1, nums2, mid2 + 1, end2, k - (mid2 - start2 + 1));//排除了nums2[start2, mid2]中的(mid2 - start2 + 1)个数
else
return help(nums1, mid1 + 1, end1, nums2, start2, end2, k - (mid1 - start1 + 1));//..
}
public double findMedianSortedArrays(int[] nums1, int[] nums2){
int left = (nums1.length + nums2.length + 1) / 2; //两个数组之和为奇数的时候,k的取值
int right = (nums1.length + nums2.length + 2) / 2; //两个数组之和为偶数,k的取值
return (help(nums1, 0, nums1.length - 1, nums2, 0, nums2.length - 1, left) + help(nums1, 0, nums1.length - 1, nums2, 0, nums2.length - 1, right)) * 0.5;
}
}
下一篇:七大排序之归并排序
文章标题:Leetcode No.4两个排序数组的中位数
文章链接:http://soscw.com/index.php/essay/38897.html