LeetCode 4.寻找两个有序数组的中位数
题目描述
给定两个大小为 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.寻找两个有序数组的中位数相关推荐
- 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- 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] 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 --- 寻找两个有序数组的中位数
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- ...
- 20191016:(leetcode习题)寻找两个有序数组的中位数
寻找两个有序数组的中位数 题目 大致思路 代码实现 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log( ...
- LeetCode(Python实现)—寻找两个有序数组的中位数
4.寻找两个有序数组的中位数 题目大意 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). ...
最新文章
- python wsdl connection refused 111
- 当前目录下所有代码中查找
- 时艳强对话酒儿:gate首发平台币的时机选择
- webstorm中vue项目--运行配制
- mysql 平均值 排序_MySQL按平均两个平均值排序
- java.lang.math.trunc,java – JPA/Hibernate返回BigDecimal不长
- iPhone上编辑html,在iphone上重新格式化一个简单的html页面
- v-for key的作用
- 【转】化学怀旧风:用扑热息痛冲胶卷!
- strcmp java_(一)strcmp函数
- 二叉树前中后序遍历及查找
- commonAncestor
- 什么是溢出?补码加法运算如何判断是否溢出?
- mysql mtq_Mysql常用简介 - osc_r3mtqivi的个人空间 - OSCHINA - 中文开源技术交流社区
- python实现支持向量机实例_一个简单的案例带你了解支持向量机算法(Python代码)...
- 我父亲给我姐姐带来了一台计算机英语,写我的家人的作文400字
- 3点内容介绍什么是物联网模组
- java 获取天气_获取免费天气(Java抓取百度天气)
- 岁月温柔-9 妈妈吃人参果的后遗症
- 2021高考成绩查询省排名,2021年全国高考难度省份排名 高考最难的省份排名公布...