leetcode-4
题目:给定两个大小分别为 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
提示:nums1.length == m nums2.length == n 0 <= m <= 1000 0 <= n <= 1000 1 <= m + n <= 2000 -106 <= nums1[i], nums2[i] <= 106
推导:

代码:
1 class Solution { 2 public: 3 int getKthElement(const vector<int>& nums1, const vector<int>& nums2, int k) { 4 5 int m = nums1.size(); 6 int n = nums2.size(); 7 int index1 = 0, index2 = 0; 8 9 while (true) { 10 // 边界情况 11 if (index1 == m) { 12 return nums2[index2 + k - 1]; 13 } 14 if (index2 == n) { 15 return nums1[index1 + k - 1]; 16 } 17 if (k == 1) { 18 return min(nums1[index1], nums2[index2]); 19 } 20 21 // 正常情况 22 int newIndex1 = min(index1 + k / 2 - 1, m - 1); 23 int newIndex2 = min(index2 + k / 2 - 1, n - 1); 24 int pivot1 = nums1[newIndex1]; 25 int pivot2 = nums2[newIndex2]; 26 if (pivot1 <= pivot2) { 27 k -= newIndex1 - index1 + 1; 28 index1 = newIndex1 + 1; 29 } 30 else { 31 k -= newIndex2 - index2 + 1; 32 index2 = newIndex2 + 1; 33 } 34 } 35 } 36 37 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { 38 int totalLength = nums1.size() + nums2.size(); 39 if (totalLength % 2 == 1) { 40 return getKthElement(nums1, nums2, (totalLength + 1)/2); 41 } 42 else { 43 return (getKthElement(nums1, nums2, totalLength/2) + getKthElement(nums1, nums2, totalLength/2 + 1)) / 2.0; 44 } 45 } 46 };
浙公网安备 33010602011771号