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 . 请找出这两个 ...
随机推荐
- Locked Treasure
题意: 有一宝箱,宝箱上有一些锁,有n个人,每个人分管一些钥匙(每个锁对应无数个钥匙), 现给出n,m 求问至少需要多少锁才能存在一种钥匙分配方案使得: 1.至少m个人才可以打开锁. 2.任选m个人一 ...
- 招聘.Net中高级软件研发工程师
岗位职责: 1.参与国土不动产系列软件需求分析.系统架构分析与设计: 2.为产品中的复杂功能编写产品开发需求文档: 3.根据设计文档或需求说明完成代码编写.调试.测试和维护: 4.配合上级进行技术决策 ...
- jquery快速入门三
事件 常用事件 click(function(){.......}) #触发或将函数绑定到指定元素的click事件 hover(function(){.....}) 当鼠标指针悬停在上面时触发.... ...
- UVa 1645 Count (递推,数论)
题意:给定一棵 n 个结点的有根树,使得每个深度中所有结点的子结点数相同.求多棵这样的树. 析:首先这棵树是有根的,那么肯定有一个根结点,然后剩下的再看能不能再分成深度相同的子树,也就是说是不是它的约 ...
- C#基础:使用Thread创建线程
Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数.下面我们用一个例子来解释怎样用Thread类 ...
- 使用ant时 出现 java.lang.OutOfMemoryErro r: Java heap space的解决办法
在Linux的shell中,使用export设置ANT_OPTS变量,值为1G export ANT_OPTS=-Xmx1g ant 同理在windows的cmd中,使用set设置ANT_OPTS变量 ...
- E20180525-hm
sensitive adj. 敏感的; 感觉的; [仪] 灵敏的; 易受影响的; lookup v. 查找; 查表; speedy adj. 快的,迅速的; 敏捷的 marshal vt. 整理, ...
- BZOJ开荒记
2019/4/16 1:04 使用Yinku2017提交了第一发,当然是A+B Problem. 看一下排行榜,算一下区域赛还有180多天吧?先用30天过50道题(含A+B Problem)怎么样?
- 1118 Birds in Forest (25 分)
Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in ...
- UVA12504【C++STL运用】
雨巨的UVA的C++题集英文真长- 题意: 有两本字典,第一行是旧字典,第二行是新字典. 每行不超过100个字符,没有空格,两本字典都可以是空的: 新key:+ 缺key:- 值变 :* 思路: 具体 ...