参考文章:1 https://blog.csdn.net/yutianxin123/article/details/52189127?utm_source=blogxgwz6
2 https://blog.csdn.net/qq_32320399/article/details/81518476
3 https://blog.csdn.net/codekiller_/article/details/61419120
方法一:
static const auto io_sync_off = []()
{
// turn off sync
std::ios::sync_with_stdio(false);
// untie in/out streams
std::cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
double findK(vector&a, int lena, vector&b, int lenb, int k)
{
int i = 0, j = 0;
for(; i < lena && j < lenb; )
{
k--;
if (a[i]= lena) ? b[j+k-1] : a[i+k-1];
}
double findMedianSortedArrays(vector &nums1, vector &nums2) {
int m = nums1.size(), n = nums2.size();
int left = (m + n + 1 ) / 2, right = (m + n + 2) / 2;
//求中位数的小技巧,总数奇偶数通用
return (findK(nums1, m, nums2, n, left) + findK(nums1, m, nums2, n, right)) / 2.0;
}
};
代码的第一个函数是我在查看leetcode前几名代码中发现的共性,可以从某种程度上减少代码的执行时间,具体细节可查看文章开头第一个连接。
方法一主要是利用一个寻找从小到大排序第K数函数findK()进行操作,最后主函数findMedianSortedArrays()调用findK(),利用求中位数小技巧,当m+n是奇数,则返回的是两个相同的中位数再除以二;当m+n是偶数,则返回的是中间(m+n)/2与(m+n)/2-1位置的数的和除以二,符合结果。上面代码的时间复杂度是O(m+n),但是题目是要求O(log(m+n)),虽然结果是通过了,但是显然是要求使用分治算法解决问题。
方法二:
static const auto io_sync_off = []()
{
// turn off sync
std::ios::sync_with_stdio(false);
// untie in/out streams
std::cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
int findK(vector &s, int m, vector &l, int n, int k){
//确保m < n
if (m > n)
return findK(l, n, s, m, k);
if (m == 0)
return l[k - 1];
if (k == 1)
return min(s[0], l[0]);
//递归过程
int i = min(m, k / 2), j = min(n, k / 2);
if (s[i - 1] > l[j - 1])
return findK(s, m, l + j, n - j, k - j);
else
return findK(s + i, m - i, l, n, k - i);
return 0; }
}
double findMedianSortedArrays(vector &nums1, vector &nums2) {
int m = nums1.size(), n = nums2.size();
int left = (m + n + 1 ) / 2, right = (m + n + 2) / 2;
//求中位数的小技巧,总数奇偶数通用
return (findK(nums1, m, nums2, n, left) + findK(nums1, m, nums2, n, right)) / 2.0;
}
};
方法二主要是使用二分法,不断缩减查找范围,缩减查找时间,复杂度是O(log(m+n))。