题目描述
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5
首先要明白“中位数”的概念:
将一个集合划分为两个长度相等的子集,其中一个子集中的元素总是大于另一个子集中的元素。
我的初版解决方案:
思路:
1:整合成一个升序数组;
2:直接取中位数;
public double findMedianSortedArrays(int[] nums1, int[] nums2) {//先合并数组,统一为升序int len1 = nums1!=null?nums1.length:0;int len2 = nums2!=null?nums2.length:0;int [] res = new int[len1 + len2];boolean num1ShengXu = true;boolean num2ShengXu = true;if(len1 > 1 && nums1[0] > nums1[1]) {num1ShengXu = false;}if(len2 > 1 && nums2[0] > nums2[1]) {num2ShengXu = false;}int i=num1ShengXu?0:len1-1,j=num2ShengXu?0:len2-1,k=0;while (i<len1 && j<len2) {if(nums1[i] > nums2[j]) {res[k++] = nums2[num2ShengXu?j++:j--];}else {res[k++] = nums1[num1ShengXu?i++:i--];}}while (num1ShengXu?i<len1:i>0) {res[k++] = nums1[num1ShengXu?i++:i--];}while (num2ShengXu?j<len2:j>0) {res[k++] = nums2[num2ShengXu?j++:j--];}//然后直接找到中位数if(res.length%2 == 0) {return (double)(res[res.length/2] + res[res.length/2 -1])/2;}else {return res[res.length/2];}}
很明显上述思路不是最优解,因为合并排序是对求中位数的充分但不必要条件。官方思路如下,没看懂…列作后续研究对象
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/