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;
}
};