您的位置:首页 > 其它

[leetcode]Median of Two Sorted Arrays

2016-10-18 19:11 405 查看
Problem Link

Description

求给定两个有序数组的中位数。如:{1,2,3} 和 {4,5,6}的中位数是3.5。

Possible solution

N = n + m

时间复杂度 :O(N logN)

先合并,后排序,然后考虑单复数,取中位数。

代码很简单,不写啦

时间复杂度:O(N)

用两个指针PA,PB扫描序列,直到扫描过(N+1)/2个后停止,N为偶数情况下接着扫描第N/2+1个。

这个做法也好理解,附代码

class Solution {
public:
double findMedianSortedArrays(vector& nums1, vector& nums2) {
int m = nums1.size(), n = nums2.size();
int k = (m + n + 1) / 2;
int counter = 0;
vector::iterator iter1 = nums1.begin();
vector::iterator iter2 = nums2.begin();
int ans = 0, ans2 = 0;
while (counter < k) {
if (iter2 == nums2.end() || (iter1 != nums1.end() && *iter1 < *iter2)) {
ans = *iter1;
++iter1;
}else {
ans = *iter2;
++iter2;
}
++counter;
}
double Ans;
if ((m + n) % 2 == 0) {
//int ans2 = 0;
if (iter2 == nums2.end() ||(iter1 != nums1.end() && *iter1 < *iter2)) ans2 = *iter1;
else ans2 = *iter2;
Ans = (ans + ans2) * 0.5;
}else Ans = ans;
return Ans ;
}
};


时间复杂度 O(log N)

这个做法不仅可以用于找中位数,也可以用于找第k小的数。

思想如下:

对于有序序列a, b, 假设a, b的长度均=K/2。比较a[k/2-1], b[k/2-1]

如果a[k/2-1] < b[k/2-1] 意味着什么?

意味着 a序列的前k/2个都不可能是第k小的元素。

这时a序列需要被考虑的部分只有后半段,并且变成寻找第k/2小的元素。

递归实现这个过程,考虑好边界情况即可。 附代码:

#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
static int findkth(vector<int>& a, int la, int ra,
vector<int>& b, int lb, int rb, int k) {
if (ra - la > rb - lb) return findkth(b,lb,rb, a, la, ra, k);
if (ra <= la) return b[k-1];
if (k == 1) return min(a[la], b[lb]);
int pos_delta = min(k/2, ra-la);
int pos_a = la + pos_delta - 1, pos_b = lb + (k-pos_delta) -1;
if  (a[pos_a] == b[pos_b]) return a[pos_a];
if  (a[pos_a] < b[pos_b])
return findkth(a, pos_a + 1, ra, b, lb, rb, k - pos_delta);
else return findkth(a, la, ra, b, pos_b+1, rb, pos_delta);
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n = nums1.size(),m = nums2.size();
int total = n + m;
if (total & 1 == 1)
return findkth(nums1, 0, n, nums2, 0, m, total/2+1);
else
return (findkth(nums1,0, n, nums2, 0, m, total/2+1)
+ findkth(nums1, 0, n, nums2, 0, m, total/2)) * 0.5;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode