Median of Two Arrays
题目描述
输入两个升序数组,输出所有数字的中位数(如果中位数有两个,则为其平均值)
分析
这题第一感觉应该是个O(log(m+n))的算法。但看了下数据范围,1 <= m + n <= 2000。这不偷懒做个O(m+n)都是对题目的不尊重吧。(两题都刷完再来写O(log(m+n)))。
思路应该比较简单,维护两个指针,从两个数组的头开始,哪个数字小就自增,直到达到中位数。处理的时候注意边界值。没什么要分析的。
代码
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int cur1 = 0, cur2 = 0;
int len = nums1.size() + nums2.size();
double res = 0.0;
while (cur1 + cur2 < (len + 1) / 2)
{
if (cur1 >= nums1.size())
cur2++;
else if (cur2 >= nums2.size())
cur1++;
else
{
if (nums1[cur1] <= nums2[cur2])
cur1++;
else
cur2++;
}
}
if (cur1 == 0)
res = nums2[cur2 - 1];
else if (cur2 == 0)
res = nums1[cur1 - 1];
else
{
if (nums1[cur1 - 1] > nums2[cur2 - 1])
res = nums1[cur1 - 1];
else
res = nums2[cur2 - 1];
}
if (len % 2 == 0)
{
if (cur1 >= nums1.size())
res += nums2[cur2];
else if (cur2 >= nums2.size())
res += nums1[cur1];
else
{
if (nums1[cur1] < nums2[cur2])
res += nums1[cur1];
else
res += nums2[cur2];
}
res = res / 2;
}
return res;
}
};
思考
再想想不一定会想出更优的算法,但不想一定很轻松