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 . 请找出这两个 ...
随机推荐
- Ladies' Shop
题意: 有 $n$ 个包,设计最少的物品体积(可重集),使得 1. 对于任意一个总体积不超过给定 $m$ 的物体集合有其体积和 恰好等于一个包的容量. 2.对于每一个包,存在一个物品集合能恰好装满它. ...
- HDOj-1425
sort Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- E20190303-hm
invoke vt. 乞灵,祈求; 提出或授引…以支持或证明; 召鬼; 借助;
- HDU1501【简单DP】
题意: 从a串和b串中顺序地取出是否能组成c串: 思路: dp[i][j] 代表从a串中取了i个,b串中取了j个的情况: #include <bits/stdc++.h> using na ...
- Rigging a Versatile Weapon Bone for 3ds Max
说明:先添加weapon到点的约束,位置,方向约束都调整好了后再建立点到手,hip的父子关系,注意这个顺序 加点的方法 点设置成box的方法: http://hewiki.heroengine.com ...
- String字符串操作题
/** * 反转键盘录入字符串 * 反转键盘录入的字符串 * 反转键盘录入的字符串 * 反转键盘录入的字符串 * */ Scanner sc = new Scanner(System.in);Stri ...
- Java并发编程面试题1
package com.mozq.thread.producer2; /* * 面试题2:以下代码是否存在错误 class ThreadTest implements Runnable{ public ...
- Java EE学习笔记(三)
Spring AOP 1.Spring AOP简介 1).AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程).它是面向对象编程(OOP)的一种补充 ...
- C. Anton and Making Potions 贪心 + 二分
http://codeforces.com/contest/734/problem/C 因为有两种操作,那么可以这样考虑, 1.都不执行,就是开始的答案是n * x 2.先执行第一个操作,然后就会得到 ...
- Jackson 动态过滤属性,编程式过滤对象中的属性
场景:有时候我们做系统的时候,比如两个请求,返回同一个对象,但是需要的返回字段并不相同. 常见与写前端接口的时候,尤其是手机端,一般需要什么数据就返回什么样的数据.此时对于返回同一个对象我们就要动态过 ...