zoukankan      html  css  js  c++  java
  • 寻找2个有序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

    请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

    你可以假设 nums1 和 nums2 不会同时为空。

    示例 1:

    nums1 = [1, 3]
    nums2 = [2]

    则中位数是 2.0
    示例 2:

    nums1 = [1, 2]
    nums2 = [3, 4]

    则中位数是 (2 + 3)/2 = 2.5

    解答1:

      

    public static double findMedianSortedArrays(int[] nums1,int[] nums2){
        /*数组1的长度*/
        int m=nums1.length;
        /*数组2的长度*/
        int n=nums2.length;
        /*保持第一个数组的长度更小*/
        if(m>n){
          return findMedianSortedArrays(nums2,nums1);
        }
        /*定义'割'后的第一个数组左边最大值,右边最小值,第二个数组左边最大值,右边最小值*/
        double lMax1=0,lMax2=0,rMin1=0,rMin2=0;
        /*lo是二分法左边的点,hi是二分法右边的点,需要把m长度变成偶数,c1是数组1的割点,c2是数组2的割点*/
        int lo=0,hi=2*m,c1,c2;
        /*当左边的点小于等于右边的点时继续*/
        while (lo<=hi){
          /*获取数组1的割点*/
          c1=(lo+hi)/2;
          /*获取数组2的割*/
          c2=m+n-c1;
          lMax1=c1==0?Integer.MIN_VALUE:nums1[(c1-1)/2];
          rMin1=c1==2*m?Integer.MAX_VALUE:nums1[c1/2];
          lMax2=c2==0?Integer.MIN_VALUE:nums2[(c2-1)/2];
          rMin2=c2==2*n?Integer.MAX_VALUE:nums2[c2/2];
          if(lMax1>rMin2){
            hi=c1-1;
          }else if(lMax2>rMin1){
            lo=c1+1;
          }else {
            break;
          }
    
        }
        return (Math.max(lMax1,lMax2)+Math.min(rMin1,rMin2))/2;
      }
    View Code

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays

  • 相关阅读:
    Gray Code
    Search a 2D Matrix
    Find Minimum in Rotated Sorted Array
    Feign理解
    Ribbon描述
    eureka自定义instance Id
    eureka开启用户认证
    idea创建Eureka consumer入门实例
    eureka描述
    activeMq的安全机制
  • 原文地址:https://www.cnblogs.com/wuyouwei/p/11854402.html
Copyright © 2011-2022 走看看