算法题:两个有序数组求中位数
leetcode上遇到的一道题,感觉很有意思
因为要求O(log(m+n)),所以第一反应时用二分来找,但是该怎么用二分呢?
数组A,B分别有序,我们可以先找到数组A中的一条分界线i,使得数组A分为A_left,和A_right两部分,那么因为时要找到中位数,我们可以直接计算出B数组的一条分界线j,使得size(Aleft)+size(Bleft)=size(Aright)+size(Bright),但此时还没有结束,因为还要满足max(aleft,bleft)<min(aright,bright)的,所以此时还要调整i的值(二分),然后通过i的值直接计算出j的值,以此循环,直到满足条件为止,设a数组大小为n,i为其分割点,b数组大小为m,j为其分割点,整体条件就是:
i+j=n+m-i-j when n+m is even or i+j=n+m+1-i-j when n+m is odd -> j=(n+m+1)/2-i m>=n。。。因为如果n>m的话j有可能小于0
a[i-1]<b[j] and a[i]>b[j-1]
对于i,j=0和i=n,j=m的边界条件需要特殊处理一下,也比较简单
比如当i=0,或者j=m时,我们不需要检查a[i-1]<b[j],只需要检查a[i]>b[j-1]
i>0,m>=n ->j=(n+m+1)/2-i<(m+n+1)/2<=(2m+1)/2==m
i<n,m>=n ->j=(n+m+1)/2-i>=(2n+1)/2-i>(2n+1)/2-n==0
这样循环的处理就简单了
1.当 i>0 and a[i-1]>b[j] -> i太大了
2.当 i<n and a[i]<b[j-1] -> i太小了
3.否则i位置合适
代码如下:
class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {if(nums2.size()<nums1.size()){return findMedianSortedArrays(nums2,nums1);} int n=nums1.size(),m=nums2.size();int left = 0,right = n;double max_left=-1,min_right=-1;while(true){int i = (right+left)/2;int j = (m+n+1)/2-i;if(i<n && nums1[i] < nums2[j-1]) //i is small{left=i+1;}else if(i>0 && nums1[i-1] > nums2[j] )// i is big{right = i-1;}else{if(i==0)max_left=nums2[j-1];else if(j==0)max_left=nums1[i-1];else max_left=max(nums1[i-1],nums2[j-1]);if((n+m)%2)return max_left;if(i==n)min_right=nums2[j];else if(j==m)min_right=nums1[i];else min_right=min(nums1[i],nums2[j]);return (min_right+max_left)/2;}}return -1;}
};
算法题:两个有序数组求中位数相关推荐
- Leetcode算法题:两个有序数组求中位数
Leetcode算法题:两个有序数组求中位数 要求时间复杂度为O(log(m+n)) 思路: 暴力解决:合并数组并排序,简单且一定能实现,时间复杂度O(m+n) 由于两个数组已经排好序,可一边排序一边 ...
- 【两个有序数组求中位数】
/* 两个有序数组求中位数问题; 这个题有很多方法: 方法一:排序,找到中位数: 方法二:归并排序的思想 方法三:转换成求第k小值 */ /* 思路:使用二分查找,时间复杂度为log(m+n). ...
- 两个有序数组求中位数的三种解法
寻找两个有序数组的中位数(附上三种解法)_BoCong-Deng的博客-CSDN博客_两个有序数组求中位数
- 算法--------------------寻找两个有序数组的中位数
题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2.请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).你可以假设 nums1 和 num ...
- 两个有序数组求中位数log(m+n)复杂度
leetcode 第4题 中位数技巧: 对于长度为L的有序数组,它的中位数是(a[ceil((L+1)/2)]+a[floor((L+1)/2)])/2 算法原理: 类似三分法求极值 两个人都前进,谁 ...
- 6 js 比较两个数组的差异_每天一道算法题(js)(3)——寻找两个有序数组的中位数...
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- python【力扣LeetCode算法题库】4- 寻找两个有序数组的中位数
寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...
- 判断给定的两个数是否是亲和数_动画演示LeetCode算法题:004-寻找两个有序数组的中位数...
题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...
- return两个返回值_LeetCode 第四题 寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
最新文章
- SAP SD基础知识之订单中装运相关的功能 II
- margin-before: 1em; margin-after: 1em;margin-start:0px;margin-end: 0px;
- bitmap文件格式分析
- Django获取请求参数方式
- PHPCMS内容模块标签
- html 移动app开发
- 当Python中混进一只薛定谔的猫……
- aloha app android,Aloha软件最新版下载-Aloha安卓版下载 v5.2.0-都去下载
- c语言文件中获取单词,从文本文件中读取单个单词并翻译 - C
- CIO40知识星球—5年工程师升职IT主管(22-27岁)
- iqc工作职责和工作内容_iqc组长岗位职责介绍
- 哪种耳机对听力伤害小?骨传导耳机能保护听力吗?
- R语言Duncan检验
- 如何在云服务器粘贴文件,云服务器粘贴文件
- 如何隐藏并禁止查看U盘
- Namenode 与 SecondaryNameNode
- 蓝光播放器中应用的触摸芯片
- thrift IDL
- CentOS 5.5 install Tomcat 6
- 冷热电气多能互补的微能源网鲁棒优化调度(Matlab代码实现)