C++leetcode找出两个有序数组的中位数(2)
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
如果不考虑复杂度的话这个题目很简单:将两个数组合并为一个数组,然后用冒泡排序算法将合并后的数组进行排序,然后用二分法找出中间的数,但是这个复杂度远远超过O(log(m + n)),因为光冒泡排序就是O(n^2)。今天在leetcode上看了半个小时,也没有想明白大神的解法,明天去找国外的导师汇报完后回来继续看,明天争取解出来,然后着手写自己国内的论文和做语音识别的仿真。坚持就是胜利。先粘贴过来大神的解法。
#include <stdio.h>
#include <vector>
using namespace std;
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n = nums1.size();
int m = nums2.size();
if (n > m) //保证数组1一定最短
{
return findMedianSortedArrays(nums2, nums1);
}
// Ci 为第i个数组的割,比如C1为2时表示第1个数组只有2个元素。LMaxi为第i个数组割后的左元素。RMini为第i个数组割后的右元素。
int LMax1, LMax2, RMin1, RMin2, c1, c2, lo = 0, hi = 2 * n; //我们目前是虚拟加了'#'所以数组1是2*n长度
while (lo <= hi) //二分
{
c1 = (lo + hi) / 2; //c1是二分的结果
c2 = m + n - c1;
LMax1 = (c1 == 0) ? INT_MIN : nums1[(c1 - 1) / 2];
RMin1 = (c1 == 2 * n) ? INT_MAX : nums1[c1 / 2];
LMax2 = (c2 == 0) ? INT_MIN : nums2[(c2 - 1) / 2];
RMin2 = (c2 == 2 * m) ? INT_MAX : nums2[c2 / 2];
if (LMax1 > RMin2)
hi = c1 - 1;
else if (LMax2 > RMin1)
lo = c1 + 1;
else
break;
}
return (max(LMax1, LMax2) + min(RMin1, RMin2)) / 2.0;
}
};
int main(int argc, char *argv[])
{
vector<int> nums1 = { 2,3, 5 };
vector<int> nums2 = { 1,4,7, 9 };
Solution solution;
double ret = solution.findMedianSortedArrays(nums1, nums2);
return 0;
}
作者: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)。
C++leetcode找出两个有序数组的中位数(2)相关推荐
- 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】寻找两个有序数组的中位数【性质分析+二分】
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- [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 ...
- Algs4-1.4.12找出两个有序数组的公共元素-方法1
1.4.12编写一个程序,有序打印给定的两个有序数组(含有N个int值)中的所有公共元素,程序在最坏情况下所需的运行时间应该和N成比. 答: import java.util.Arrays; publ ...
- leetcode 4 --- 寻找两个有序数组的中位数
1 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:设计一个时间复杂度为 O(log (m+n)) 的算法. 2 解 ...
- [leetcode] 4. 寻找两个有序数组的中位数
官方题解:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu- ...
最新文章
- android system window,Android控件的fitSystemWindows属性
- python byte和string转换
- 30KVA UPS电源安装电线的配置
- Android 小项目之--数据存储【Network】(附源码)
- php集成paypal接口,PHP中集成PayPal标准支付,php集成paypal标准_PHP教程
- 统计数据:Google排名高的是什么样的页面?
- win10电脑开机密码忘了怎么办_电脑开机密码忘了怎么办最简单的方法_windows7教程...
- LEADTOOLS构建HTML5 DICOM/PACS查看器
- Atitit 知识图谱解决方案:提供完整知识体系架构的搜索与知识结果overview
- 超星pdg格式转换为pdf格式原理方法
- sqlplus连接mysql_sqlplus连接的三种方式
- 通信系统仿真原理与无线应用笔记-MATLAB
- 如何打开计算机无线功能灰色,计算机没有wifi,仅显示宽带连接. 右键单击灰色的无线网络连接图...
- 冯森林:手机淘宝中的那些Web技术
- Android go app 安装包,安卓go系统刷机
- 解决Pr cc 2019主页加载不出来的问题
- Liunx配置jdk
- Excel高级图表制作④——控件+Offset组合,让图表真正动起来!
- 树梅派切换源_树莓派—raspbian软件源(全)
- error: variable has incomplete type ‘QApplication‘ 错误解决