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 ))

posted @ 2022-03-01 17:34  Uitachi  阅读(29)  评论(0)    收藏  举报