一、概述:

这道题思路其实蛮简单的,就是边界太难考虑了,所以一直没能通过,写了好长的代码考虑边界,然后看到一个大神写的代码:

https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/c-er-fen-cha-zhao-by-da-li-wang/ 。简直是叹为天人,敬佩不已,发现自己走的路还很长。

二、思路:

由于是两个排序的数组,只要两个数组的间距为保持为总长的一半,二分遍历较短的数组,然后通过一半思路去求另一个数组的位置,比较数组的左边是否小于另一数组当前节点,如果是,找到中位数的位置。

特别需要注意的是,在较长的数组上一定存在一个中位数。

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {if (nums1.size() > nums2.size())return findMedianSortedArrays(nums2, nums1);int M = nums1.size();int N = nums2.size();int l = 0;int r = M;while (l <= r) {int mid = (r - l) / 2 + l;int rightPos = (N + M) / 2 - mid;int max1 = (mid - 1 >= 0) ? nums1[mid - 1] : INT_MIN;int min1 = (mid < M) ? nums1[mid] : INT_MAX;int max2 = (rightPos - 1 >= 0) ? nums2[rightPos - 1] : INT_MIN;int min2 = (rightPos < N) ? nums2[rightPos] : INT_MAX;if (max1 > min2) { //如果num1[mid]左边的数大于右边指向的数,中位数左移r = mid - 1;}else if (max2 > min1) { //如果num1[mid]右边的数大于左边指向的数,中位数右移l = mid + 1;}else {l = r = mid;break;}}int u = l;  //指向nums1对应的中位数位置int v = (M + N) / 2 - l; //指向中位数右边对应中位数的位置int low = max(u - 1 >= 0 ? nums1[u - 1] : INT_MIN,v - 1 >= 0 ? nums2[v - 1] : INT_MIN);int high = min(u < M ? nums1[u] : INT_MAX,v < N ? nums2[v] : INT_MAX);if ((N + M) % 2 == 1)return high;return float(low + high) / 2;
}

leetcode C++ 4. 寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log相关推荐

  1. python两个数组合并、找出中位数_leetcode刷题记录-找出这两个有序数组的中位数(python版本)...

    谨以此文记录一下自己刷题的过程,虽然技术能力一般,相信刷完整套题目自己的编程能力定会有提高,代码都是个人创作,不一定是最好的,仅供参考和交流 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...

  2. Leetcode04--给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。

    文章目录 题目 一.归并算法 二.二分查找法 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:你能设计一个时间复杂度 ...

  3. LeetCode3:合并两个有序数组 给你两个有序数数组,nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组.

    合并两个有序数组 问题描述: 给你两个有序数数组,nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组. 说明: 初始化nums1和nums2的元素数量分别为m和n ...

  4. Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素

    本文使用两种算法来实现,分别是二分查找法和插值查找法,发现插值查找法更好,更快地找到需要的数据. 代码如下: package com.moson.search;import java.util.Arr ...

  5. 一个数组中,除两个元素其余都出现了两次,找出这两个元素

    为什么80%的码农都做不了架构师?>>>    本文为转载,原文地址是:http://blog.csdn.net/morewindows/article/details/821400 ...

  6. 数组两个整数相加 c语言,作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)...

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  7. 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值输入 [1,3,5,7,9,11] 10输出 1,9 3,7 代码: import java.util.HashMap; import java ...

  8. 一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次,找出这两个数字

    题目:一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次. 找出这两个数字,编程实现. 参考代码: #include<stdio.h> #include <windows. ...

  9. 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 编写一个函数找出这两个只出现一次的数字。

    一个数组中只有两个数字是出现一次,其他所有数字都出现了两次.编写一个函数找出这两个只出现一次的数字. 1.代码编写 2.结果 1.代码编写 代码如下(示例): #define _CRT_SECURE_ ...

最新文章

  1. 使用动态代理,提高工作效率
  2. Spring.net 类库目录
  3. Java数组的十大方法
  4. HTTP网页请求响应的状态码/状态代码
  5. 持续集成之 Spring Boot 实战篇
  6. java标识语_Java 基本语法,标识符,修饰符,关键字
  7. 初学者参考C#中操作XML修改完整版
  8. Linux下安装和卸载jdk及环境配置
  9. 东芝固态硬盘升级工具下载(软件+DMG)
  10. 【贵州大学计算机考研1】三本学生考研上岸贵州大学软件工程专硕(附带真题与答案)
  11. C#中背景图片布局设置
  12. GTX 1070Ti正式发布!iGame Vulcan X家族再添新成员
  13. 鸿蒙os手机评测视频,鸿蒙OS正式发布:荣耀智慧屏首发,一起来体验鸿蒙OS吧
  14. 瞧一瞧~看一看~MyCat架构剖析免费不要钱!(下)
  15. join()方法的作用
  16. 清华博士导师整理:Tensorflow 和 Pytorch 的笔记(包含经典项目实战)
  17. 计算机 计算能力测试题,高中数学计算能力训练题.doc
  18. 《边缘云计算技术及标准化白皮书》
  19. python伪造邮件发件地址_python-SMTPSenderRefused-553,发件人地址未经验证-Django电子邮件表格...
  20. 遗忘的国度-梦幻西游(男人的中庸之道)

热门文章

  1. 在 asp.net core \ vs2015 update2 情况况下创建 asp.net core web application 的问题
  2. docker网络原理
  3. Object-C-block
  4. 找到一个不错的ASP.net电子图书下载网站
  5. linux驱动由浅入深系列:高通sensor架构实例分析之一
  6. Android Low Battery 低电量处理流程
  7. 高通msm8994启动流程简介
  8. Linux下Tomcat添加为系统服务
  9. 算法时间复杂度和空间复杂度表示
  10. Jquery的集合方法EACH()