题目:

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n))

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

第一步:解题思路

  方法一:二分查找

  中位数位于数组的的中间位置

  奇数、偶数

 

     我们使用一条红色分割线把两个数组分别分割成两部分:

  1.  红线左边和右边的元素个数相等,或者左边的元素的个数比右边元素的个数多1个;

  2.  红线左边的所有元素的数值 <= 红线右边的所有元素的数值;public class Solustion  public double findMedianSortedArrays(int[] nums1, int[] nums2){

          if(nums1.length > nums2.length){
               int[] temp = nums1;
               nums1 = nums2;
               nums2 = temp;  
          }
          
          int m = nums1.length;
          int n  = nums2.length;

          // 分割线左边的所有元素需要满足的个数 m + (n - m +1) / 2
         int totalLeft = (m + n + 1)/2;
         
         // 在 nums1 的区间 [0, m] 里查找恰当的分割线
         // 使得 nums1[i - 1] <= nums2[j] && nums2[j - 1] <= nums1[i]
         int left = 0;
         int right = m;
         
         while( left < right){
             int i = left + (right - left + 1) / 2;
        int j = totalLeft - i;
        if(nums1[i-1]>nums2[j]){
          // 下一轮搜索的区间 [left, i-1]
          right = i - 1;
        }else{
// 下一轮搜索的区间 [i, right]
          left = i;
}
}

     int }

  

 

 

  

 posted on 2022-03-23 15:22  北极鳕  阅读(39)  评论(0编辑  收藏  举报