0
点赞
收藏
分享

微信扫一扫

【leetcode 4】寻找中位数

1.​​题目链接​​。这个题目使用分治来写似乎不是很好想。大概的写法就是:我们需要使用分治一步一步的找到中位数在哪个位置。我们首先在两个数组各自取出一总长度一半的数据,判断取出来的数据的最大值,确定中位数到底在哪个区间。555,语言表达能力不强,看代码吧,还是很好理解的。

class Solution 
{
public:
double findKth(vector<int>& nums1, vector<int>& nums2, int K)
{
if (nums1.size() > nums2.size())
{
return findKth(nums2, nums1, K);
}
//递归的出口
if (nums1.size() == 0)
{
return nums2[K - 1];
}
if (nums2.size() == 0)
{
return nums1[K - 1];
}
if (K == 1)
{
return min(nums1[0], nums2[0]);
}
//int s = max(nums1.size(), nums2.size());
int s = nums1.size();
int l1 = min(K / 2, s);
int l2 = K - l1;
if (nums1[l1 - 1] < nums2[l2 - 1])
{
vector<int> tem1(nums1.begin() + l1, nums1.end());
vector<int> tem2(nums2.begin(), nums2.begin() + l2);
return findKth(tem1, tem2, K - l1);
}
else
{
vector<int> tem1(nums1.begin(), nums1.begin() + l1);
vector<int> tem2(nums2.begin() + l2, nums2.end());
return findKth(tem1, tem2, K - l2);
}
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
{
int len1 = nums1.size(), len2 = nums2.size();
int mid = (len1 + len2)>>1;
if (len1 + len2&1)
{
return findKth(nums1, nums2, mid + 1);

}
else
{
return (findKth(nums1, nums2, mid) + findKth(nums1, nums2, mid + 1)) / 2.0;

}
}
};

 


举报

相关推荐

0 条评论