寻找两个正序数组的中位数
题目
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
-
示例 1:
输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2
-
示例 2:
输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
-
示例 3:
输入:nums1 = [0,0], nums2 = [0,0] 输出:0.00000
-
示例 4:
输入:nums1 = [], nums2 = [1] 输出:1.00000
-
示例 5:
输入:nums1 = [2], nums2 = [] 输出:2.00000
-
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
-
题目来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
思路1:合并两个数组排序后找中位数,判断合并后数组是奇数还是偶数,然后直接求得中位数。
- 代码
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
double midnum=0.00000;
if(nums1.size()+nums2.size()<=0) return midnum;
for(int i=0;i<nums2.size();i++){
nums1.push_back(nums2[i]);
}
sort(nums1.begin(),nums1.end());
if(nums1.size()%2==0){
midnum+=(nums1[(nums1.size()-1)/2]+nums1[(nums1.size()+1)/2]);
midnum/=2.0;
}else{
midnum+=(nums1[(nums1.size()-1)/2]);
}
return midnum;
}
-
结果
-
思考
看到题目后第一反应就是合并数组排序,求中位数;后面看了一小时的讨论和分享,发现自己太年轻了。写题目时,看到进阶部分(这才是hard的部分),就自作聪明用了快排sort,时间复杂度就已经O( l o g ( N ) log(N) log(N))了,跟别说前面还用push_back合并到一个数组中,时间虽然没有到O(N)地步,但也是超出O( l o g ( N ) log(N) log(N))一大截了。
思路2:就是采用二分法,对两个数组不断切割,最后分类讨论;我就不赘述了,下面有链接(含代码和解题思路)。(之所以推荐这个,是写的很好,评论说比官方的还优化了)
-
链接
作者:bian-bian-xiong
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/4-xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-shu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
总结:这道题目,简单的写法是很简单的,但是如果要按进阶部分来写那才真的算得上hard(毕竟刷过几百题的人也不一定写的对hard题),如果按hard部分来写,对于掌握二分法真的有很大帮助。