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 解题思路:
1.将两个数组合并后排序,算法复杂度取决于排序算法的复杂度,比如使用快速排序,算法复杂度NlogN;
2.思路同1,但不对数组排序,因为两个数组已经排序,只需要合并即可,对两个排序数组合并,算法复杂度可到O(n)(合并只需到n/2处即可停止,但不影响复杂度);
3.使用二分查找法。过程分为两个部分:第一部分是使用二分法查找数组中小于某个值的元素的个数;这个结果结合这个值在另一数组中的位置可标识其在整个排序数组中的位置;第二部分则是使用二分法和第一部分的方法遍历数组查找中位数; 代码如下:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int c1 = nums1.size();
int c2 = nums2.size();
bool odd = (c1 + c2) % == ; int m1 = FindNth(nums1,nums2,(c1 + c2) / );
if(!odd)
{
int m2 = FindNth(nums1,nums2,(c1 + c2) / - );
return (m1 + m2) / 2.0;
}
else
{
return m1;
}
} int FindNth(vector<int>& nums1, vector<int>& nums2, int n)
{
if(nums1.empty() && nums2.empty())
{
return ;
}
int left = ;
int right = nums1.size() - ;
while(left <= right)
{
int md = left + (right - left) / ;
int r = GetLess(nums2,nums1[md]);
if(md + r > n)
{
right = md-;
}
else if(md + r < n)
{
left = md + ;
}
else
{
return nums1[md];
}
} left = ;
right = nums2.size() - ;
while(left <= right)
{
int md = left + (right - left) / ;
int r = GetLess(nums1,nums2[md]);
if(md + r > n)
{
right = md-;
}
else if(md + r < n)
{
left = md + ;
}
else
{
return nums2[md];
}
} return nums2[left]; //针对两个数组中有相同元素的情况,
} int GetLess(vector<int>& nums, int n)
{
int left =;
int right = nums.size()-; while(left <= right)
{
int mid = left + (right - left) / ;
if(nums[mid] < n)
{
left = mid+;
}
else if(nums[mid] > n)
{
right = mid-;
}
else
{
return mid + ;
}
} return left;
}
这个解法中需要注意的是在两个数组中有相同元素的情况(一个数组有相同元素不会有问题),比如nums1={1},nums2={1},这种情况下,根据我们使用“当前数组的位置+另一个数组中小于该元素的个数”的方法,则会出现两个相同元素在总数组中位置相同的情况。我们可以这么理解,假设V在总数组中的位置是p,其相同值的另一个元素位置则是p-1,但根据我们的计算方式这两个元素计算的位置结果是一样的,都是p,也就是说我们使用FindNth(nums,p-1)的时候,两个while循环不会返回,即找不到p-1的元素,所以在FindNth中,我们直接返回left指向的指,注意这时left肯定指向相同的元素。
leetcode 4.两个排序数组的中位数的更多相关文章
- LeetCode 4 - 两个排序数组的中位数 - [分治]
题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 给定两个大小为 m 和 n 的有序数组 n ...
- LeetCode#5 两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 ...
- leetcode,两个排序数组的中位数
先上题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 ...
- leetcode python两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 不同 ...
- LeetCode(4):两个排序数组的中位数
Hard! 题目描述: 有两个大小为 m 和 n 的排序数组 nums1 和 nums2 . 请找出两个排序数组的中位数并且总的运行时间复杂度为 O(log (m+n)) . 示例 1: nums1 ...
- LeetCode4. 两个排序数组的中位数
4. 两个排序数组的中位数 问题描述 There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the ...
- 2.Median of Two Sorted Arrays (两个排序数组的中位数)
要求:Median of Two Sorted Arrays (求两个排序数组的中位数) 分析:1. 两个数组含有的数字总数为偶数或奇数两种情况.2. 有数组可能为空. 解决方法: 1.排序法 时间复 ...
- LeetCode-4. 两个排序数组的中位数(详解)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 有两个大小为 m 和 n 的排序数组 nums ...
- JavaScript实现获取两个排序数组的中位数算法示例
本文实例讲述了JavaScript排序代码实现获取两个排序数组的中位数算法.分享给大家供大家参考,具体如下: 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个 ...
随机推荐
- Tautonym Puzzle
题意: 构造一个长度不超过200,数字不大于100的序列,使得合法子序列的个数恰好为N: 合法子序列是指一个长度为偶数的序列,前一半和后一半相等. 解法: 考虑这种构造方法 假设我们当前有序列为 $x ...
- 【Hadoop】HDFS笔记(一):Hadoop的RPC机制
RPC(Remote Procedure Call, 远程过程调用)主要面对两个问题: 1.对象调用方式: 2.序列/反序列化机制. Hadoop实现的RPC组件依赖于Hadoop Writable类 ...
- UVa 12661 Funny Car Racing (dijkstra)
题意:给定一个有向图,每条路有5个整数修饰,u, v, a, b, t,表示起点为u,终点为v,打开时间a,关闭时间为b,通过时间为t,打开关闭是交替进行的, 问你从s到t最短时间是多少. 析:使用d ...
- Srping MVC入门推荐
看了不少大牛们的博客,对Spring MVC心里还是一团迷雾. 看了<Spring in Action>(Spring实战),疑惑渐渐明朗. 特推荐此书.
- 【转】Maven 入门
[转]http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html Maven入门--概念与实例 最近由于工作原因在研究 ...
- setInterval和setTImeout中的this指向问题
问题:在setInterval和setTimeout中传入函数时,函数中的this会指向window对象 解决方法: 1. 将当前对象的this存为一个变量,定时器内的函数利用闭包来访问这个变量.va ...
- jpa使用原生SQL查询数据库like的用法
jpa使用like查询,需要拼接字符串,如下 oracle用法: //dao层代码 @Query(value = "SELECT * FROM TABLENAME WHERE USER_NA ...
- C++内存泄漏检测
CRT检测 定位内存泄漏位置 #include "stdafx.h" #ifdef _DEBUG #define DEBUG_NEW new( _NORMAL_BLOCK, __F ...
- (转)关于MongoDB你需要知道的几件事
本文列举了颇让作者困惑的一些MongoDB限制,如果你也打算使用MongoDB,那么至少要提前了解这些限制,以免遇到的时候措手不及. 消耗磁盘空间 这是我的第一个困惑:MongoDB会消耗太多的磁盘空 ...
- 生成Jar包 源码Jar包-字节码Jar包 不可运行Jar包-可运行Jar包