LeetCode4. 寻找两个正序数组的中位数
题目
分析
此题目转换为求两个有序数组的第 K 小的数
参考 https://www.acwing.com/solution/content/50/
代码
1 class Solution { 2 public: 3 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { 4 int tol = nums1.size() + nums2.size(); 5 //判断奇数还是偶数,若为奇数就返回中间的那个,若为偶数就返回中间两数之和 6 if(tol % 2 == 0){ 7 int left = find(nums1,0,nums2,0,tol / 2); 8 int right = find(nums1,0,nums2,0,tol / 2 + 1); 9 return (left + right ) / 2.0; 10 }else{ 11 return find(nums1,0,nums2,0,tol / 2 + 1); 12 13 } 14 } 15 16 //将本问题转换为在两个数组中寻求第 K 小数 17 int find(vector<int> &nums1,int i ,vector<int>&nums2,int j,int k){ 18 //默认nums1 数组的长度 < nums2 数组的长度 19 if(nums1.size() - i > nums2.size() - j) return find(nums2,j,nums1,i,k); 20 21 //边界判断 22 //1.若 K 为 第一小的数 23 if(k == 1){ 24 //若nums1为空,返回nums2的第一个元素 25 if(nums1.size() - i == 0) return nums2[j]; 26 else return min(nums1[i],nums2[j]); //nums1不为空 27 } 28 29 //2. 若nums1 为空,从 nums2里面找 30 if(nums1.size() - i == 0) return nums2[j + k -1]; //因为 K 的取值是从 1 开始的所以要 - 1 31 32 int si = min((int)nums1.size(),i + k/2),sj = j + k - k/2; //si 要取最小,否则可能会越界 33 if(nums1[si -1] > nums2[sj - 1] ) return find(nums1,i,nums2,j + k/2,k - k/2); 34 else{ 35 return find(nums1,si,nums2,j,k -(si - i)); 36 } 37 38 } 39 };
时间复杂度 O (log(m + n ))

浙公网安备 33010602011771号