AIRobot

AIRobot quick note


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

LeetCode 4 寻找两个有序数组的中位数

发表于 2018-12-28 更新于 2019-01-15 分类于 algorithm
本文字数: 1.7k 阅读时长 ≈ 2 分钟
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
给定两个大小为 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

官方数据很水,O(n+m)的复杂度就给过了,按照题目要求做。
中位数就是把一组数据分为两个长度相等的数据组,log(m+n)的复杂度并且数组有序,很自然得想到二分。受到限制的是,这个两个数组分别有序,即使合并也会有n+m的复杂度。所以,不可能每个数据都访问,要同时二分。主要目的就是分成两个长度相等的数据组,所以可以二分得调两个数组个数直到相等。要处理好边界。

官方题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m, n;
m = nums1.size();
n = nums2.size();
if(m>n)
{
swap(nums1, nums2);
swap(m, n);
}
int iMin = 0, iMax = m, halfLen = (m+n+1)>>1;
while(iMin<=iMax)
{
int i = (iMin + iMax)>>1;
int j = halfLen - i;
if(i<iMax&&nums2[j-1]>nums1[i])
iMin = i+1;
else if(i>iMin && nums1[i-1]>nums2[j])
iMax = i-1;
else
{
int maxLeft = 0;
if(i==0)
maxLeft = nums2[j-1];
else if(j==0)
maxLeft = nums1[i-1];
else
maxLeft = max(nums1[i-1], nums2[j-1]);
if((m+n)&1)
return maxLeft;

int minRight = 0;
if(i==m)
minRight = nums2[j];
else if(j==n)
minRight = nums1[i];
else
minRight = min(nums2[j], nums1[i]);
return (maxLeft+minRight)/2.0;
}
}
return 0;
}
};
# LeetCode
仙岛求药
Use MathJax in the MarkDown
AIRobot

AIRobot

AIRobot quick note
130 日志
15 分类
23 标签
GitHub E-Mail
Creative Commons
0%
© 2023 AIRobot | 716k | 10:51