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

 

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:


        def find_kth(nums1,nums2,a_start,b_start,kth):

            if a_start >= len(nums1):
                return nums2[b_start + kth-1]# 第k大的数,第1大的数是num[start]
            if b_start >= len(nums2):
                return nums1[a_start + kth-1]
    
            if kth == 1:
                return min(nums1[a_start],nums2[b_start])   
          
            a_mid = a_start + kth//2-1  # k大数 -1
            b_mid = b_start + kth//2-1

            if a_mid < len(nums1) and b_mid < len(nums2):
                if nums1[a_mid] < nums2[b_mid]:
                    return find_kth(nums1,nums2,a_mid+1,b_start,kth-kth//2) #k-kth
                else:
                    return find_kth(nums1,nums2,a_start,b_mid+1,kth-kth//2)
             
            if a_mid < len(nums1):
                return find_kth(nums1,nums2,a_mid+1,b_start,kth-kth//2)
            if b_mid < len(nums2):
                return find_kth(nums1,nums2,a_start,b_mid+1,kth-kth//2)
        
        n1 = len(nums1)
        n2 = len(nums2)
        k = (n1+n2)//2 
        if (n1+n2)%2==1:
            return find_kth(nums1,nums2,0,0,k+1)
        else:
            return  (find_kth(nums1,nums2,0,0,k+1) + find_kth(nums1,nums2,0,0,k))/2

 

 

 

 

 1 class Solution {
 2 public:
 3     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
 4         int m = nums1.size();
 5         int n = nums2.size();
 6         if (m+n==0) return 0;
 7         if ((m+n)%2==1) {
 8             return find_kth(nums1,nums2,0,0,(m+n)/2+1);
 9         } else {
10             return (find_kth(nums1,nums2,0,0,(m+n)/2) + find_kth(nums1,nums2,0,0,(m+n)/2+1))/2;
11         }
12     }
13     // kth == 1,2,3,4
14     //寻找2个有序数组 合并后的第 k 大数字
15     double find_kth(vector<int>& nums1, vector<int>& nums2, int a_start, int b_start, int kth) {
16         if (a_start>=nums1.size()) {
17             return nums2[b_start+kth-1];
18         }
19         if (b_start>=nums2.size()) {
20             return nums1[a_start+kth-1];
21         }
22         if (kth == 1) {
23             return std::min(nums1[a_start],nums2[b_start]);
24         }
25         int a_mid = a_start + kth/2 -1;
26         int b_mid = b_start + kth/2 -1;
27         if (a_mid < nums1.size() && b_mid < nums2.size()) {
28             if (nums1[a_mid] < nums2[b_mid]) {
29                 return find_kth(nums1,nums2,a_mid+1,b_start,kth-kth/2);
30             } else {
31                 return find_kth(nums1,nums2,a_start,b_mid+1,kth-kth/2);
32             } 
33         } else if (a_mid < nums1.size())  return find_kth(nums1,nums2,a_mid+1,b_start,kth-kth/2);
34         else if (b_mid < nums2.size())  return find_kth(nums1,nums2,a_start,b_mid+1,kth-kth/2);
35         else return 0;
36     }
37 };

 

posted @ 2022-03-30 14:50  乐乐章  阅读(27)  评论(0编辑  收藏  举报