[leetcode] 4. 寻找两个有序数组的中位数
官方题解:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-shu-b/
class Solution {public:double findMedianSortedArrays(vector<int>& A, vector<int>& B) {int m = A.size();int n = B.size();if(m > n){vector<int> temp = A;A = B;B = temp;m = A.size();n = B.size();}int iMin = 0, iMax = m, halfLen = (n + m + 1)/2;while(iMin <= iMax){int i = (iMin+iMax)/2; //0 <= i <= m;int j = halfLen - i; //i + j = m - i + n - j 或 i + j = m - i + n - j + 1if(i < iMax && B[j-1] > A[i]){//i < m ==> j > 0//并且m < n ==> j <= n iMin = i + 1; //too small}else if(i > iMin && A[i-1] > B[j]){//i > 0 ==> j < n//并且m < n ==> j >= 0 iMax = i - 1; //too big}else{double maxLeft = 0;if(i == 0){ maxLeft = B[j-1]; }else if(j == 0) { maxLeft = A[i-1]; }else { maxLeft = max(A[i-1], B[j-1]); }if ( (m + n) % 2 == 1 ) { return maxLeft; }int minRight = 0;if(i == m) { minRight = B[j]; }else if(j == n){ minRight = A[i]; }else { minRight = min(A[i], B[j]); }return (maxLeft + minRight)/2.0;}}return 0.0;}
};
m <= n的作用:
if(i < iMax && B[j-1] > A[i]){//i < m ==> j > 0 //并且m < n ==> j <= n iMin = i + 1; //too small}
由i < m ==> j > 0
,但是,这个时候j
会大于n
吗?
不会,因为i
是大于等于0
小于等于m
的,由m <= n
(一开始保证了) 可以推出j < = n
,因为i
越小,j
就越大,i == 0
时,j
最大,j = (m + n + 1) /2 - 0 <= (2n + 1)/2 <= n
(int运算)
else if(i > iMin && A[i-1] > B[j]){//i > 0 ==> j < n//并且m < n ==> j >= 0 iMax = i - 1; //too big}
这个也是同理,由i > 0 ==> j < n
,由m < n ==> j >= 0
,因为i
越大,j
就越小,i == m
时,j
最大,j = (m + n + 1) /2 - m >= (n - m + 1)/2 >= 0
(int运算,m <= n
)
[leetcode] 4. 寻找两个有序数组的中位数相关推荐
- 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- leetcode 4. 寻找两个有序数组的中位数,c语言
leetcode上第四道题,如下. 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2.请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).你可以假 ...
- LeetCode 4. 寻找两个有序数组的中位数(二分查找,难)
文章目录 1. 题目 2. 解题 2.1 合并数组 2.2 优化2.1解法,双指针 2.3 二分法(找第k个数) 2.4 切分法 1. 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...
- [leetcode] 4 寻找两个有序数组的中位数(二分+递归查找第K小数)(重要)
问题描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 n ...
- Leetcode(4)寻找两个有序数组的中位数
题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 n ...
- LeetCode 4.寻找两个有序数组的中位数
题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 n ...
- leetcode 4 --- 寻找两个有序数组的中位数
1 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:设计一个时间复杂度为 O(log (m+n)) 的算法. 2 解 ...
- 20191016:(leetcode习题)寻找两个有序数组的中位数
寻找两个有序数组的中位数 题目 大致思路 代码实现 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log( ...
- LeetCode(Python实现)—寻找两个有序数组的中位数
4.寻找两个有序数组的中位数 题目大意 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). ...
最新文章
- htmlcss实例小项目_HTMLCSS学习笔记(十九)-- 媒体查询
- linux 下oracle启动步骤
- CodeForces - 739E Gosha is hunting(最大费用最大流+思维建边)
- done (330 lines in 0.02 seconds). 私人笔记,一份WEB测试报告
- 这个网站收集了很多杂志的审稿周期和收稿、拒稿意见,值得看看
- 关于Hystrix的几个问题
- Element NavMenu
- 知行合一!如何做好项目经理?
- 源代码安装apache遇到的问题解决
- Step by Step-构建自己的ORM系列-索引
- js中小数四舍五入问题
- oracle数据库课后报告,ORACLE数据库课程设计报告
- 2019 live tex 发行版_下载和安装Texlive2019
- 微支付几个参数的获得
- 学生用计算机怎么调,电脑怎么设置学生模式
- does not have a companion object, and thus must be initialized here
- 关于oracle驱动jiar包版本问题导致的ORA-01460【mybatis+Oracle】
- BLE MESH组网(七)真机配置
- matlab如何在三维曲面上画线,如何在三维曲面上画线
- 2022年新消费趋势洞察(护肤篇):时下大热的美妆成分全面复盘
热门文章
- python自动化办公入门-[Python] 自动化办公 docx操作Word基础代码
- python画直方图-从零开始学Python【13】--matplotlib(直方图)
- python画折线图-python如何画折线图
- python读音-原来Python应该这么念,怪不得总被嘲笑~
- 线上python课程一般多少钱-培训python多少钱 ?
- python程序-调试Python程序代码的几种方法总结
- 步进电机选型计算实例_滚珠丝杠选型和电机选型计算
- React-组件生命周期
- 存储图片到第三方云服务器
- win10查询计算机ip和用户名和密码,Win10系统查询计算机IP子网掩码和默认网关设置教程...