给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
思路:计算两个数组的长度,按照依次对比大小的方式把两个数组合并成一个,按照长度求出计算中位数的是哪两个(长度和为偶数)或一个(长度和为奇数)。然后普通思路进行。。。
#include <iostream> #include <vector> double findMedianSortedArrays(std::vector<int>& nums1, std::vector<int>& nums2) { int len1 = nums1.size(); int len2 = nums2.size(); int a = 0, b = 0; int count = 0; if (((len1 + len2) % 2) == 0) { int num1 = (len1 + len2) / 2; int num2 = (len1 + len2) / 2 + 1; double *s = new double[num2]; while (count<num2) { if ((a<len1&&b<len2&&nums1[a]<=nums2[b]) || (a<len1&&b == len2)) { s[count] = nums1[a]; a++; } else if ((a<len1&&b<len2&&nums1[a]>nums2[b]) || (b < len2&&a == len1)) { s[count] = nums2[b]; b++; } else break; count++; } double temp1 = s[num2 - 1]; double temp2 = s[num1 - 1]; delete[] s; return (temp1+temp2) / 2; } else { int num1 = (len1 + len2) / 2 + 1; double *s = new double[num1 + 1]; while (count<num1+1) { if ((a<len1&&b<len2&&nums1[a]<=nums2[b]) || (a<len1&&b == len2)) { s[count] = nums1[a]; a++; } else if ((a<len1&&b<len2&&nums1[a]>nums2[b]) || (b < len2&&a == len1)) { s[count] = nums2[b]; b++; } else break; count++; } double temp = s[num1 - 1]; delete[] s; return temp; } } int main() { std::vector<int> a = { 0 }; std::vector<int> b = { 0 }; double aa = findMedianSortedArrays(a, b); std::cout << aa << std::endl; system("pause"); return 0; }
执行用时: 72 ms, 在Median of Two Sorted Arrays的C++提交中击败了7.44% 的用户
内存消耗: 21.8 MB, 在Median of Two Sorted Arrays的C++提交中击败了0.53% 的用户
有点垃圾。。。
改进思想参考:https://blog.csdn.net/hang404/article/details/84786904