Median of Two Sorted Arrays (from leetCode)
A.题意
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
大概题目的意思是,给你两个排序好的数组nums1和nums2,然后你找出这两个数组中所有数的中位数,要求的算法时间复杂度为O(log (m+n))。
B.思路
由两个数组已经排序好,并且对时间要求复杂度为O(log (m+n))我们很容易想到类比于归并排序的思路,我们只需要一个变量计数到中间位置,然后类似于归并排序思路把中位数找出来即可,每一次循环若数组nums1当前位置数字小于nums2当前位置数字则移动nums1当前位置,反之移动nums2.
C.代码实现
代码实现这里有一些临界的小细节一开始没考虑,所以这里写的有些小乱。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int all = nums1.size() + nums2.size();
if(nums1.size() == 0) //处理nums1为空的情况
{
int size = nums2.size();
if(size % 2 == 0)
return (nums2[size / 2] + nums2[size / 2 - 1]) / 2.0;
else
return (double)nums2[size / 2];
}
if(nums2.size() == 0) //处理nums2为空的情况
{
int size = nums1.size();
if(size % 2 == 0)
return (nums1[size / 2] + nums1[size / 2 - 1]) / 2.0;
else
return (double)nums1[size / 2];
}
double ans;
int num[2] = {0, 0}; //用来储存最近遍历的两个数字
int j = 0, k = 0;
for (int i = 0; i <= all / 2; i++)
{
if (nums1[j] <= nums2[k] && j < nums1.size())
{
num[0] = num[1];
num[1] = nums1[j]; // 把大的数字放后面
j++;
}
else if (nums1[j] > nums2[k] && k < nums2.size())
{
num[0] = num[1];
num[1] = nums2[k]; // 把大的数字放后面
k++;
}
else if (k >= nums2.size()) // 当nums2已经遍历完的情况
{
num[0] = num[1];
num[1] = nums1[j];
j++;
}
else if (j >= nums1.size()) // 当nums1已经遍历完的情况
{
num[0] = num[1];
num[1] = nums2[k];
k++;
}
}
if (all % 2 == 0)
ans = (num[0] + num[1]) / 2.0;
else
ans = (double)num[1];
return ans;
}
};