zoukankan      html  css  js  c++  java
  • [LeetCode-JAVA] Median of Two Sorted Arrays

    题目:

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

    思路:题目大意是找到两个数组的中位数,查了下相关定义,计算有限个数的数据的中位数的方法是:把所有的同类数据按照大小的顺序排列。如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。

    分享下网上很简洁思路的算法,找两个数组中第k小元素,该方法的核心是将原问题转变成一个寻找第k小数的问题(假设两个原序列升序排列),这样中位数实际上是第(m+n)/2小的数。所以只要解决了第k小数的问题,原问题也得以解决。

    首先假设数组A和B的元素个数都大于k/2,我们比较A[k/2-1]和B[k/2-1]两个元素,这两个元素分别表示A的第k/2小的元素和B的第k/2小的元素。这两个元素比较共有三种情况:>、<和=。如果A[k/2-1]<B[k/2-1],这表示A[0]到A[k/2-1]的元素都在A和B合并之后的前k小的元素中。换句话说,A[k/2-1]不可能大于两数组合并之后的第k小值,所以我们可以将其抛弃。

    代码:

    public class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            int len1 = nums1.length;
            int len2 = nums2.length;
    
            int total = len1 + len2;
            if(total % 2 == 1)
                return findKth(nums1, 0, len1-1, nums2, 0, len2-1, total/2+1);
            else
                return (findKth(nums1, 0, len1-1, nums2, 0, len2-1, total/2) 
                        + findKth(nums1, 0, len1-1, nums2, 0, len2-1, total/2+1)) / 2;
        }
        
        public double findKth(int[] a, int astart, int aend, int[] b, int bstart, int bend, int k){
            int m = aend - astart + 1;
            int n = bend - bstart + 1;
            if(m > n)  //时刻保持a为最短 方便后续判断
                return findKth(b, bstart, bend, a, astart, aend, k);
            if(m == 0)  //当有一个数组为空时  
                return b[bstart + k-1];  // 第k小的
            if(k == 1) //找最小的
                return Math.min(a[astart], b[bstart]);
                
            int da = Math.min(k/2, m);   //当m的长度不足k时,需要整个的a数组
            int db = k - da;
            
            if(a[astart + da - 1] < b[bstart + db - 1]){
                return findKth(a, astart+da, aend, b, bstart, bend, k - da);
            }else if(a[astart + da - 1] > b[bstart + db - 1]){
                return findKth(a, astart, aend, b, bstart+db, bend, k - db);
            }else{
                return a[astart + da - 1];
            }
        }
    }

    参考链接: http://blog.csdn.net/yutianzuijin/article/details/11499917/

          http://www.cnblogs.com/springfor/p/3861890.html

  • 相关阅读:
    mysql 创建++删除 数据表
    mac 配置apache
    mac 安装mysql
    mysql 创建++删除 数据库
    配置默认编码为utf8
    mysql 添加用户
    mysql 查看库结构---查看表结构
    centos7
    centOS 7 安装mysql
    修改字符集
  • 原文地址:https://www.cnblogs.com/TinyBobo/p/4552918.html
Copyright © 2011-2022 走看看