目录

解题思路1

具体代码

解题思路2

具体代码


题目描述:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (m+n)) 。

题目链接:寻找两个有序数组的中位数

解题思路1

在我一开始看到这个题目的时候,首先想到的方法就是合并两个数组,边合并边排序,之后取中间的数字即可,这种写法是简单,可是时间复杂度是O(m+n),而题目的要求是O(log (m+n)),显然这种方法是行不通的。

从最大值开始依次比较插入新的数组,完成后取中间值即可.

具体代码

class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int length1 = nums1.length;int length2 = nums2.length;int totalLength = length1 + length2;int[] newNums = new int[totalLength];length1 -= 1;length2 -= 1;totalLength -= 1;while(length1 >= 0 && length2 >= 0) {if(nums1[length1] > nums2[length2]) {newNums[totalLength--] = nums1[length1--];}else {newNums[totalLength--] = nums2[length2--];}}while(length1 >= 0) {newNums[totalLength--] = nums1[length1--];}while(length2 >= 0) {newNums[totalLength--] = nums2[length2--];}totalLength = nums1.length + nums2.length;int mid = totalLength/2;if(totalLength % 2 == 1) {return (double)newNums[mid];}return (newNums[mid] + newNums[mid-1])/2.0;}
}

解题思路2 

这种解法的时间复杂度为题目要求的O(log (m+n)),且空间复杂度为O(1),显然优于第一种思路。

该种思路的主要思想为二分思想,每比较一次就缩小一次范围,具体思路如下所示:

首先,整体分为两种情况,一种是两个数组所有数字加起来为偶数,另一种是奇数

当为奇数时,直接寻找中间的即可

当为偶数时,需要找到中间的两个相加再除以二

经过上述分析,可以大致搭建出整个程序的框架,之后再去寻找指定下标的数字即可.

以如下数组为例

这两个数组元素个数和为奇数,因此只需找到中间那一个即可,首先根据数组长度可以得出要寻找的是下标为(nums1 + nums2) / 2,即下标为4的元素,即第五个元素。

定义一个函数来寻找两个数组中第k小的元素,传入两个数组和k.

在该函数中,首先定义出index1和index2,初始化为0.

根据k,index1和index2确定出需要比较的下标,并进行比较.3<8,因此可以排除3左边的数字,此时再更新k的值,改变index1即可

则继续根据 来确定要比较的下标,比较过后继续更改index以及k的值,第二次比较过后,k == 2,index1等于3,index2等于0,此时index1等于length1,对其特殊判断即可得到第k小的数.

            if(index1 == length1) {return nums2[k+index2-1];}

同理,当index2等于length2时,也需要对其特殊处理

            if(index2 == length2) {return nums1[k+index1-1];}

如果k == 1时,未出现上述两个条件,例如一个数组是[1,2],另一个数组是[3]时,直接返回下标为index1和index2两个数较小的那一个即可

            if(k == 1) {return Math.min(nums1[index1], nums2[index2]);}

 具体代码

class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int length1 = nums1.length;int length2 = nums2.length;int totalLength = length1 + length2;if(totalLength % 2 == 1) {int midIndex = totalLength / 2;double ret = getKthNumber(nums1, nums2, midIndex+1);return ret;}else {int midIndex1 = totalLength / 2 - 1;int midIndex2 = totalLength / 2;double ret = (getKthNumber(nums1, nums2, midIndex1+1) + getKthNumber(nums1, nums2, midIndex2+1)) / 2.0;return ret;}}private double getKthNumber(int[] nums1, int[] nums2, int k) {int length1 = nums1.length;int length2 = nums2.length;int index1 = 0;int index2 = 0;while(true) {if(index1 == length1) {return nums2[k+index2-1];}if(index2 == length2) {return nums1[k+index1-1];}if(k == 1) {return Math.min(nums1[index1], nums2[index2]);}int half = k/2;int newIndex1 = Math.min(index1+half, length1)-1;int newIndex2 = Math.min(index2+half, length2)-1;int pivot1 = nums1[newIndex1];int pivot2 = nums2[newIndex2];if(pivot1 <= pivot2) {k -= (newIndex1 - index1 + 1);index1 = newIndex1 + 1;}else {k -= (newIndex2 - index2 + 1);index2 = newIndex2 + 1;}}}
}

分享一道力扣困难题~寻找两个有序数组的中位数(Java)相关推荐

  1. return两个返回值_LeetCode 第四题 寻找两个有序数组的中位数

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

  2. leetcode算法题--寻找两个有序数组的中位数★★

    原文链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 图示(来源): double findMedianSortedAr ...

  3. 力扣寻找两个有序数组的中位数

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

  4. 算法--------------------寻找两个有序数组的中位数

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

  5. 两个有序数组的中位数 python_Python寻找两个有序数组的中位数实例详解

    Python寻找两个有序数组的中位数 审题: 1.找出意味着这是一个查找算法题 2.算法复杂度log级别,就是提示你是二分查找 3.二分查找实现一般为递归 (1)递归包括递归体 (2)终止条件 思路: ...

  6. Python寻找两个有序数组的中位数

    Python寻找两个有序数组的中位数 审题: 找出意味着这是一个查找算法题 算法复杂度log级别,就是提示你是二分查找 二分查找实现一般为递归 (1)递归包括递归体 (2)终止条件 思路: 定理: 有 ...

  7. LeetCode4. 寻找两个有序数组的中位数

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

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

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

  9. (JS)寻找两个有序数组的中位数

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

最新文章

  1. Scratch等级考试(一级)模拟题
  2. 钱学森在30年前对虚拟现实和元宇宙的思考
  3. 【mongoDB实战】mongo对某个键添加索引
  4. 物流机器人小车的运动控制与定位
  5. Maven项目构建练习
  6. 5课件制作_【计算机论文】虚拟现实技术下多媒体课件开发的流程
  7. react-native gradle
  8. HTML5实现输入密码(六个格子)
  9. mybatis配置log4j控制台打印SQL语句
  10. dbf转成excel_DBF Converter将DBF文件转换成Excel表格教程
  11. C语言中mac是什么意思,CMAC是什么意思
  12. 2022最新百度网盘无限扩容方法技术分享-免费扩100T
  13. NSG2 安装、运行备忘
  14. 31省市自治区农村居民消费价格指数(2010-2020年)
  15. html标记是否都包含开始和结束,所有HTML标记符都包括开始标记符和结束标记符()...
  16. python 文字转语音 带情感_Python文字转换语音,让你的文字会「说话」抠脚大汉秒变撒娇萌妹...
  17. 07 面向对象编程-结构、封装、继承、多态、接口
  18. 关于手机话费充值的方法
  19. Colab 上使用shutil.copytree()复制整个文件夹到另一个文件夹
  20. Attention Is All You Need 论文笔记

热门文章

  1. vivos7和荣耀x10哪个好 vivos7和荣耀x10区别评测
  2. vue 移动端 安卓手机出现 lineheight=height 垂直不居中问题
  3. Midjourney V5 比 V4 更好吗?Prompt 全公开(下篇)
  4. python爬取网易云热评
  5. 基于stm32的非接触式红外测温系统
  6. 物联网IOT选型wifi路由模块串口透传不得不知的秘密
  7. QT+GIS+opengl,实现地图瓦片的离线opengl渲染,支持放大拖拽
  8. macOS 系统下静态路由常用操作
  9. 华为IPsec IKE自动协商配置
  10. 24节气-芒种 || 一分耕耘,一分收获。