题目描述

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

nums1 = [1, 3]
nums2 = [2]则中位数是 2.0

示例 2:

nums1 = [1, 2]
nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5

题解

方法一:归并法

思路

数组是有序的,则可以采用归并的思想:假设两个数组的规模为(m+n),每次从两个数组中取出剩下元素中较小的一个,一直取到第(m+n+1)/2次。若(m+n)为奇数,则第(m+n+1)/2次所取的数即为答案;若(m+n)为偶数,则需要再取一个数,与第(m+n+1)/2次所取的数的平均值即为答案。

    public double findMedianSortedArrays(int[] nums1, int[] nums2) {int time = (nums1.length + nums2.length + 1)/2;int i=0, j=0;int res = 0;while(time > 0) {if(i >= nums1.length) {res = nums2[j++];} else if(j >= nums2.length) {res = nums1[i++];} else if(nums1[i] < nums2[j]) {res = nums1[i++];} else {res = nums2[j++];}time--;}if(totalNum % 2 == 1)return res;int res2 = 0;if(i >= nums1.length) {res2 = nums2[j];} else if(j >= nums2.length) {res2 = nums1[i];} else if(nums1[i] < nums2[j]) {res2 = nums1[i];} else {res2 = nums2[j];}return ((int)(res + res2))/2.0;}

复杂度分析

  • 时间复杂度:O(m+n) 。

  • 空间复杂度:O(1)。

方法二

利用中位数的性质:中位数左右两边的元素个数相等。

class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int[] a, b;if(nums1.length <= nums2.length) {a = nums1;b = nums2;} else {a = nums2;b = nums1;}int m = a.length;int n = b.length;int low = 0;int high = m;int i, j;while(low <= high) {i = (low + high)/2;j = (m + n + 1)/2-i;if(i > low && a[i-1] > b[j])high = i - 1;else if(i < high && b[j-1] > a[i])low = i + 1;else {int maxLeft;if(i == 0)maxLeft = b[j-1];else if(j == 0)maxLeft = a[i-1];elsemaxLeft = Math.max(a[i-1], b[j-1]);if((m+n)%2 == 1)return maxLeft;int minRight;if(i == m)minRight = b[j];else if(j == n)minRight = a[i];elseminRight = Math.min(a[i], b[j]);return (maxLeft + minRight)/2.0;}}return 0.0;}
}

复杂度分析

  • 时间复杂度:O(log(m+n)) 。

  • 空间复杂度:O(1)。

LeetCode 4.寻找两个有序数组的中位数相关推荐

  1. 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...

  2. leetcode 4. 寻找两个有序数组的中位数,c语言

    leetcode上第四道题,如下. 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2.请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).你可以假 ...

  3. LeetCode 4. 寻找两个有序数组的中位数(二分查找,难)

    文章目录 1. 题目 2. 解题 2.1 合并数组 2.2 优化2.1解法,双指针 2.3 二分法(找第k个数) 2.4 切分法 1. 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...

  4. [leetcode] 4 寻找两个有序数组的中位数(二分+递归查找第K小数)(重要)

    问题描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 n ...

  5. Leetcode(4)寻找两个有序数组的中位数

    题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 n ...

  6. leetcode 4 --- 寻找两个有序数组的中位数

    1 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:设计一个时间复杂度为 O(log (m+n)) 的算法. 2 解 ...

  7. [leetcode] 4. 寻找两个有序数组的中位数

    官方题解:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu- ...

  8. 20191016:(leetcode习题)寻找两个有序数组的中位数

    寻找两个有序数组的中位数 题目 大致思路 代码实现 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log( ...

  9. LeetCode(Python实现)—寻找两个有序数组的中位数

    4.寻找两个有序数组的中位数 题目大意 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). ...

最新文章

  1. python wsdl connection refused 111
  2. 当前目录下所有代码中查找
  3. 时艳强对话酒儿:gate首发平台币的时机选择
  4. webstorm中vue项目--运行配制
  5. mysql 平均值 排序_MySQL按平均两个平均值排序
  6. java.lang.math.trunc,java – JPA/Hibernate返回BigDecimal不长
  7. iPhone上编辑html,在iphone上重新格式化一个简单的html页面
  8. v-for key的作用
  9. 【转】化学怀旧风:用扑热息痛冲胶卷!
  10. strcmp java_(一)strcmp函数
  11. 二叉树前中后序遍历及查找
  12. commonAncestor
  13. 什么是溢出?补码加法运算如何判断是否溢出?
  14. mysql mtq_Mysql常用简介 - osc_r3mtqivi的个人空间 - OSCHINA - 中文开源技术交流社区
  15. python实现支持向量机实例_一个简单的案例带你了解支持向量机算法(Python代码)...
  16. 我父亲给我姐姐带来了一台计算机英语,写我的家人的作文400字
  17. 3点内容介绍什么是物联网模组
  18. java 获取天气_获取免费天气(Java抓取百度天气)
  19. 岁月温柔-9 妈妈吃人参果的后遗症
  20. 2021高考成绩查询省排名,2021年全国高考难度省份排名 高考最难的省份排名公布...

热门文章

  1. jquery 动态分页,本地分页
  2. js计算器运算部分的逻辑(附代码)
  3. 华为AR1200系列路由器WEB登录服务开启
  4. C#实现HTTP服务器:(5)压缩传输(GZip,Deflate)
  5. Golang 错误捕获 Panic 与 Recover
  6. C++流媒体开源库Live555详细介绍
  7. 天气不是太好 当然心情也如此
  8. 把数字翻译成字符串python_剑指offer-46把数字翻译成字符串-python
  9. 计算机的世界是这样的。。。。
  10. 银行(Account)