题目
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
示例 3:
输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:
输入:nums1 = [], nums2 = [1]
输出:1.00000
示例 5:
输入:nums1 = [2], nums2 = []
输出:2.00000
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
Solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <iostream> #include <vector>
using namespace std;
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int s1 = 0; int e1 = nums1.size() - 1; int s2 = 0; int e2 = nums2.size() - 1; while (true) { if (s1 > e1) { if (s2 + 1 < e2) { s2++; e2--; } else { return ((double)nums2[s2] + nums2[e2]) / 2; } continue; } if (s2 > e2) { if (s1 + 1 < e1) { s1++; e1--; } else { return ((double)nums1[s1] + nums1[e1]) / 2; } continue; } if (s1 <= e1 && s2 <= e2) { if (s1 == e1 && s2 == e2) { return ((double)nums1[e1] + nums2[e2]) / 2; } if (nums1[s1] > nums2[s2]) { s2++; } else { s1++; } if (nums1[e1] < nums2[e2]) { e2--; } else { e1--; } } } } };
int main() { std::vector<int> input1 = {1, 2}; std::vector<int> input2 = {3, 4}; std::cout << Solution().findMedianSortedArrays(input1, input2) << std::endl; }
|