寻找两个正序数组的中位数
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数
#include <vector> #include <iostream> using namespace std; class Solution { public: double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2) { int n = nums1.size(); int m = nums2.size(); vector<int> &shorter = n <= m ? nums1 : nums2; vector<int> &longer = n <= m ? nums2 : nums1; int pivot = (n + m + 1) / 2; int i, j; for (i = 0; j = pivot - i, i < shorter.size(); ++i) { if (shorter[i] >= longer[j - 1]) break; } if ((n + m) % 2 == 1) { if (i == 0) return (double) longer[j - 1]; else { return (double) shorter[i - 1] > longer[j - 1] ? shorter[i - 1] : longer[j - 1]; } } else { int left, right; if (i == 0) left = longer[j - 1]; else { if (j == 0) left = shorter[i - 1]; else left = shorter[i - 1] > longer[j - 1] ? shorter[i - 1] : longer[j - 1]; } if (i == shorter.size()) right = longer[j]; else { if (j == longer.size()) right = shorter[i]; else right = shorter[i] < longer[j] ? shorter[i] : longer[j]; } return ((double) left + (double) right) / 2; } } }; int main() { vector<int> nums1{1, 2}; vector<int> nums2{3, 4}; Solution s; cout << s.findMedianSortedArrays(nums1, nums2) << endl; }
浙公网安备 33010602011771号