leecode第四题(寻找两个有序数组的中位数)

题解:





class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size();
int n = nums2.size();
if (m > n) return findMedianSortedArrays(nums2, nums1);//保证nums1个数少于nums2
int iMin = , iMax = m, halfLen = (m + n + ) / ;
while (iMin <= iMax) {
int i = (iMin + iMax) / ;
int j = halfLen - i;//保证左右部分数目一样多
if (i < iMax && nums2[j - ] > nums1[i]) {
iMin = i + ; // i is too small
}
else if (i > iMin && nums1[i - ] > nums2[j]) {
iMax = i - ; // i is too big
}
else { // i is perfect,这里满足左部分最大点小于等于右部分最小点
int maxLeft = ;
if (i == ) { maxLeft = nums2[j - ]; }
else if (j == ) { maxLeft = nums1[i - ]; }
else { maxLeft = max(nums1[i - ], nums2[j - ]); }//这些都是极值情况,放在最后输出处理即可
if ((m + n) % == ) { return maxLeft; }
int minRight = ;
if (i == m) { minRight = nums2[j]; }
else if (j == n) { minRight = nums1[i]; }
else { minRight = min(nums2[j], nums1[i]); }
return (maxLeft + minRight) / 2.0;//偶数个的中位数
}
}
return 0.0;
}
};
总结:
我很惭愧,这个题写了三个多小时都没做出来,我一开始看到时间复杂度,想到二分法,然后不停判断并删除两个数组中大于中位数的值,然后稳定条件是两个数组剩余个数是m+n的一半,程序就是有问题。。。
总得来说还是没有洞悉最有价值的规律,分析情况又把我绕迷糊了,唉,学习到了。
leecode第四题(寻找两个有序数组的中位数)的更多相关文章
- LeetCode刷题:第四题 寻找两个有序数组的中位数
题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 ...
- leetcode第四题:两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- LeetCode Golang 4. 寻找两个有序数组的中位数
4. 寻找两个有序数组的中位数 很明显我偷了懒, 没有给出正确的算法,因为官方的解法需要时间仔细看一下... func findMedianSortedArrays(nums1 []int, nums ...
- 0004. 寻找两个有序数组的中位数(Java)
4. 寻找两个有序数组的中位数 https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 最简单的就是用最简单的,把两个数组分别抽出然 ...
- Leetcode(4)寻找两个有序数组的中位数
Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定两个大小为 m 和 n 的有序数组 nums1 和* nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O( ...
- Java实现 LeetCode 4 寻找两个有序数组的中位数
寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...
- leetcode刷题四<寻找两个有序数组的中位数>
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- 寻找两个有序数组的中位数 C++实现leetcode系列(四)
给定两个大小为 m 和 n 的有序数组 nums1和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不 ...
- Leetcode题库——4.寻找两个有序数组的中位数
@author: ZZQ @software: PyCharm @file: findMedianSortedArrays.py @time: 2018/10/10 19:24 说明:给定两个大小为 ...
- leetcode 4 寻找两个有序数组的中位数 二分法&INT_MAX
小知识 INT_MIN在标准头文件limits.h中定义. #define INT_MAX 2147483647#define INT_MIN (-INT_MAX - 1) 题解思路 其实是类似的二分 ...
随机推荐
- java321 面向对象编程
- shell 中的小技巧
去掉最后一个字符 sed 's/.$//' awk '{sub(/.$/,"")}1' awk '{printf $0"\b \n"}' [root@ ~]# ...
- curl 抓取图片
/** * curl 抓取图片 * @param $url * @return mixed */ public static function downLoadImage($url) { $heade ...
- JavaScript实现全选功能
最终效果: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
- 从percona server 5.7换到mariadb 10.2
过去两年半一直推荐使用percona server,今天开始,因为一些mysql迟迟不不愿意支持的特性,打算换回mariadb 10.2了,具体哪些不说了,总之非常关键,mariadb都支持一两年了, ...
- ThirdAPI
//public class ThirdAPI //{ // [DllImport("ThirdAPI.dll")] // public static extern int Ini ...
- face_recognition 基础接口
face_recognition 基础接口 face_recognition使用世界上最简单的人脸识别库,在Python或命令行中识别和操作人脸. 使用dlib最先进的人脸识别技术构建而成,并具有深度 ...
- 什么是ip地址,什么是私有地址
ip地址链接:https://jingyan.baidu.com/article/f96699bbf23089894e3c1be7.html 私有地址链接:https://baike.baidu.co ...
- 计算多数的乘积(Python实现)
1 # -*- coding: utf-8 -*- # sum_of_products.py # @author 0yst3r # @description 两数之积及多数之积 # @created ...
- 牛客网数据库SQL实战(16-20)
16.统计出当前各个title类型对应的员工当前薪水对应的平均工资.结果给出title以及平均工资avg.CREATE TABLE `salaries` (`emp_no` int(11) NOT N ...