zoukankan      html  css  js  c++  java
  • 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的右边放在一起,得到两个集合。

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

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

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

  • 相关阅读:
    Hibernate之Query接口的uniqueResult()方法
    一个安静的地方
    AJAX实现简单的省市二级联动
    为了你们,而活着。
    PL/SQL Developer 连接远程Oracle数据库
    dotfuscator混淆的问题
    查询表内属于主键的列SQLServer2005
    关于net2.0里面新出现的类backgroundworker的应用 引用自http://www.cnblogs.com/dlwang2002/archive/2006/12/07/585093.html
    SQLServer int to base16
    数据库查询问题日期格式
  • 原文地址:https://www.cnblogs.com/LoganChen/p/8796732.html
Copyright © 2011-2022 走看看