<span style="color: inherit; font-family: inherit; line-height: 1.1; background-color: rgb(255, 255, 255);">Median of Two Sorted Arrays</span>
My Submissions
<span style="color: inherit; font-family: inherit; line-height: 1.1; background-color: rgb(255, 255, 255);">Median of Two Sorted Arrays</span>
Total Accepted: 65547 Total Submissions: 383655 Difficulty: Hard
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)).
Have you met this question in a real interview?
这题花费了我好久的时间,所以就写的详细一点吧。
问题是,在两个排好序的数组中,在时间为 O(log (m+n))内输出这两个数组的中位数。
思路:调用函数输出两个排好序数组中的第k小数。
首先
假如a数组为空,那么直接返回b数组第k小即可。同理,假如b数组为空。。。。。。
假如k==1的话,那么直接返回a,b数组第一个元素中小一点的那个就好。
int halfk=k/2;
假如两个数组的长度都大于等于halfk,那么你比较数组中a[halfk]与b[halfk],如果a[halfk]小于b[halfk],那么数组a中的前halfk个必然是前k小的数中的一部分,然后更新a数组,使a数组成为a[halfk+1]开始的数组。反之,如果a[halfk]大于b[halfk],那么数组b中的前halfk个必然是前k小的数中的一部分,然后更新b数组,使b数组成为b[halfk+1]开始的数组。注意此处边界值的情况,假如数组的长度恰好等于halfk,那么数组更新后,其长度为0.
假如两个数组的长度不都大于halfk,例如a数组长度小于halfk,那么比较a数组最后一个数与b[haltk],那如果是小于的话,a数组的所有元素都在前k小,接着找b就好。
// test4MedianOfTwoSortedArr.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <vector>
using std::vector;
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2);
int findKthMin(vector<int>& nums1, vector<int>& nums2, int astart, int bstart, int k);
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> a= {2,3,4,5,6};
vector<int> b= {1};
double s = findMedianSortedArrays(a,b);
return 0;
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
{
int m = nums1.size();
int n = nums2.size();
if ((m + n) % 2 == 0)
{
int temp1 = findKthMin(nums1, nums2, 0, 0, (m + n) / 2);
int temp2 = findKthMin(nums1, nums2, 0, 0, (m + n) / 2 + 1);
double s = temp1 + temp2;
double result = s / 2;
return result;
}
else
return findKthMin(nums1, nums2, 0, 0, (m + n + 1) / 2);
}
int findKthMin(vector<int>& nums1, vector<int>& nums2, int astart, int bstart,int k)
{
if (nums1.size() - astart == 0)
return nums2[k - 1 + bstart];
if (nums2.size() - bstart == 0)
return nums1[k - 1 + astart];
if (k == 1)
{
if (nums1[astart] < nums2[bstart])
return nums1[astart];
else
return nums2[bstart];
}
int halfk = k / 2;
if (nums1.size() - astart >= halfk && nums2.size() - bstart >= halfk)
{
if (nums1[halfk + astart - 1] <= nums2[halfk + bstart - 1])
{
if (nums1.size() - astart == halfk)
return findKthMin(nums1, nums2, nums1.size(), bstart, k - halfk);//表示num1的所有的都包含在了前k小。
else
return findKthMin(nums1, nums2, astart + halfk, bstart, k - halfk);
}
else
{
if (nums2.size() - bstart == halfk)
return findKthMin(nums1, nums2, astart, nums2.size(), k - halfk);
else
return findKthMin(nums1, nums2, astart, bstart + halfk, k - halfk);
}
}
if (nums1.size() - astart < halfk)
{
if (nums1[nums1.size() - 1] < nums2[halfk + bstart - 1])
return findKthMin(nums1, nums2, nums1.size(), bstart, k - (nums1.size() - astart));
else
{
if (nums2.size() - bstart == halfk)
return findKthMin(nums1, nums2, astart, nums2.size(), k - halfk);
else
return findKthMin(nums1, nums2, astart, bstart + halfk, k - halfk);
}
}
if (nums2.size() - bstart < halfk)
{
if (nums2[nums2.size() - 1] < nums1[halfk + astart - 1])
return findKthMin(nums1, nums2, astart, nums2.size(), k - (nums2.size()-bstart));
else
{
if (nums1.size() - astart == halfk)
return findKthMin(nums1, nums2, nums1.size(), bstart, k - halfk);
else
return findKthMin(nums1, nums2, astart + halfk, bstart, k - halfk);
}
}
}