LeetCode-Median of Two Sorted Arrays

 

代码如下:

package com.leetcode.study;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        int[] nums1 = new int[]{1,2};
        int[] nums2 = new int[]{3,4};
        System.out.println(findMedianSortedArrays(nums1, nums2));

    }
    public static double findMedianSortedArrays(int[] nums1,int[]nums2){
        int m = nums1.length;
        int n = nums2.length;
        if(m>n){//保证m<=n
            int[]temp=nums1;nums1=nums2;nums2=temp;
            int tmp=m;m=n;n=tmp;
        }
        int iMin = 0,iMax=m,halfLen=(m+n+1)/2;
        while(iMin<=iMax){
            int i = (iMin+iMax)/2;
            int j = halfLen - i;
            if(i<iMax&&nums2[j-1]>nums1[i]){
                iMin = iMin+1;//i is too small
            }else if(i>iMin&&nums1[i-1]>nums2[j]){
                iMax=iMax-1;//i is too big
            }else{
                //i is prefect
                int maxLeft=0;
                if(i==0){
                    maxLeft=nums2[j-1];
                }else if(j==0){
                    maxLeft=nums1[i-1];
                }else{
                    maxLeft=Math.max(nums1[i-1], nums2[j-1]);
                }
                if((m+n)%2==1){
                    return maxLeft;
                }
                int minRight = 0;
                if(i==m){
                    minRight=nums2[j];
                }else if(j==n){
                    minRight=nums1[i];
                }else{
                    minRight=Math.min(nums2[j], nums1[i]);
                }
                return (maxLeft+minRight)/2.0;
            }
        }
        return 0.0;
    }
}

这个有点复杂,看不太懂。

中位数是要把有序的数组分成两个等长的部分。

我们首先把数组A分成两个等长的部分:

数组A公有m个元素,所以公有m+1种分法。

而且我们知道,左边的长度为i,右边的长度为m-i。当i=0时左边是空的,当i=m时,右边是空的。即:

同样的,我们可以对B进行划分:

我们把A的左边和B的左边放在一起,把A的右边和B的右边放在一起,得到两个集合。

如果我们可以保证左边集合的长度和右边集合的长度相等,而且左边最大的元素小于右边最小的元素,那么我们就可以得到中位数:

为了保证左边集合元素个数和右边集合元素个数相等,我们要确保:

为了保证左边集合的最大元素小于右边集合的最小元素,我们要确保:

 

转载于:https://www.cnblogs.com/LoganChen/p/8796732.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值