给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n))
。
4. 寻找两个正序数组的中位数 - 力扣(LeetCode)
示例 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
class Solution { public: int getKthElement(const vector<int>& nums1, const vector<int>& nums2,int k){ int ps1 = 0;//nums1指针 int ps2 = 0;//nums2指针 int sums1 = nums1.size(); int sums2 = nums2.size(); while(true){ if(ps1 == sums1){//如果nums1为空 return nums2[ps2+k-1]; } if(ps2 == sums2){//如果nums2为空 return nums1[ps1+k-1]; } if(k == 1){//到最初数组的位置 return min(nums1[ps1],nums2[ps2]); } //所以第三个if必须放在最下面,防止数组越界 int new_ps1 = min(ps1 + k/2 - 1,sums1-1);//选个小的防止越界,new_ps1的值是在删除之后剩下数组里面的位置。此时ps1是剩下数组的左边界 int new_ps2 = min(ps2 + k/2 - 1,sums2-1); if(nums1[new_ps1] <= nums2[new_ps2]){ k -= new_ps1 - ps1 + 1;//删掉小的数据之后,更新应该找那个位置(相对于剩下数组) ps1 = new_ps1 + 1;//更新边界 }else{ k -= new_ps2 - ps2 +1; ps2 = new_ps2 +1; } } } double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int sum = nums1.size()+nums2.size(); if(sum%2 == 1){ return getKthElement(nums1,nums2,(sum+1)/2);//奇数情况 }else{ return (getKthElement(nums1,nums2,sum/2) + getKthElement(nums1,nums2,sum/2+1))/2.0;//偶数情况 } } };