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)).
Example 1:
nums1 = [1, 3] nums2 = [2] The median is 2.0
Example 2:
nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5
Person tips: 二分法。假设nums1长度小于等于nums2,则始终对nums1进行二分操作。在两个数组中寻找中位数时,奇数个寻找第pos=(m+n+1)/2个元素;偶数个通过寻找第pos=(m+n+1)/2个元素,并返回第pos和第pos+1个元素的一半。pos=m_pos+n_pos。nums1中寻找第m_pos个元素,nums2中寻找第n_pos个元素。则代码如下:
class Solution
{
public:
double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2)
{
if (nums1.size() > nums2.size())
{
vector<int> temp = nums1;
nums1 = nums2;
nums2 = temp;
}
int m = nums1.size(), n = nums2.size();
int l = 0, r = m, m_pos, n_pos, pos = (m + n + 1) / 2; //l和r指向二分区间两端,在两个数组中寻找第pos个元素
while (l<=r)
{
m_pos = (l + r) / 2;//在nums1中使用第m_pos个元素
n_pos = pos - m_pos;//在nums2中使用第n_pos个元素
if (m_pos > 0 && nums1[m_pos - 1] > nums2[n_pos])
r = m_pos - 1;
else if (m_pos < m && nums1[m_pos] < nums2[n_pos - 1])
{
l = m_pos + 1;
}
else
break;
}
double p;
if (m_pos == 0)
p = nums2[pos - 1];
else if (n_pos == 0)
p = nums1[pos - 1];
else
{
p = ((nums1[m_pos - 1] > nums2[n_pos - 1]) ? nums1[m_pos - 1] : nums2[n_pos - 1]);
}
if ((m + n) % 2)
return p;
else
{
if (m_pos == m)
{
p +=nums2[n_pos];
}
else if (n_pos == n)
{
p += nums1[m_pos];
}
else
{
p += ((nums1[m_pos] < nums2[n_pos]) ? nums1[m_pos] : nums2[n_pos]);
}
}
p /= 2.0;
return p;
}
};
本文介绍了一种在O(log(m+n))的时间复杂度内找到两个有序数组中位数的方法。通过确保较短数组始终作为二分查找的目标,算法能够有效地定位中位数所在的位置。
664

被折叠的 条评论
为什么被折叠?



