Median of Two Sorted Arrays(获取两个有序数列的中值)

原创 2017年09月11日 19:29:26

转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/77936830

Median of Two Sorted Arrays

最近没事刷LeetCode,有一题很有意思,取中值问题。

中值是指将统计总体当中的各个变量值按大小顺序排列起来,形成一个数列,处于变量数列中间位置的变量值就称为中位数。当数列的项数N为奇数时,处于中间位置的变量值即为中位数;当数列的项数N为偶数时,中位数则为处于中间位置的2个变量值的平均数。

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)).

Example 1:

nums1 = [1, 3]

nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]

nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

题目意思是给定两个排好序的数组,然后找到这两个数组的中值,要求时间复杂度是O(log (m+n))。

正常思路是将两个数组合并成一个新的有序数组,然后直接找到中值就行了,时间复杂度是O(m+n),但是题目要求时间复杂度是O(log (m+n)),这就比较有意思了。

思路

正常解决是先排序再求中值,但是由于只需要拿到中值,所以理论上只需要排一半的序就可以获取中值,但是排序的话时间复杂度达不到O(log (m+n))的要求。

再深入理解一下,获取中值,可以理解成拿到数组中的第k个数。数组元素数为奇数,中值就是length/2 + 1的位置的数;当为元素数为偶数,中值就是length/2和length/2 + 1两个位置的平均值。

理清思路之后就可以开始着手解决了。

public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    int totalLength = nums1.length + nums2.length;

    if((totalLength & 0x1) == 1) { // 奇数
        return findMedian(nums1, nums1.length, nums2, nums2.length, totalLength/2 + 1);
    } else {
        return (findMedian(nums1, nums1.length, nums2, nums2.length, totalLength/2)
                + findMedian(nums1, nums1.length, nums2, nums2.length, totalLength/2 + 1)) /2d;
    }
}

解题思路取了巧,看到O(log (m+n))复杂度的时候,立马想到了二分法。

private static double findMedian(int[] longerArray, int m, int[] shorterArray, int n, int k) {
    if(n > m) { // 保证第一个数组是比较长的数组
        return findMedian(shorterArray, n, longerArray, m, k);
    }

    if(n == 0) { // 当短数组为空时候,直接从长数组中获取数值
        return longerArray[k - 1];
    }

    if(k == 1) { // 当数值位置在第一位时,比较两个数组获取最靠前的数值
        return Math.min(longerArray[0], shorterArray[0]);
    }

    // 根据比例二分那个数组
    int mk = (int)(m*k/(m + n)*1f);
    int nk = k - mk;

    if(longerArray[mk - 1] > shorterArray[nk - 1]) {
        int[] newLonger = Arrays.copyOfRange(longerArray, 0, mk);
        int[] newShort = Arrays.copyOfRange(shorterArray, nk, n);
        //去除了比较小的一部分,相当于整个数值向左移动了nk位
        return findMedian(newLonger, newLonger.length, newShort, newShort.length, k - nk);
    } else if(longerArray[mk - 1] < shorterArray[nk - 1]) {
        int[] newLonger = Arrays.copyOfRange(longerArray, mk, m);
        int[] newShort = Arrays.copyOfRange(shorterArray, 0, nk);
        //去除了比较小的一部分,相当于整个数值向左移动了nk位
        return findMedian(newLonger, newLonger.length, newShort, newShort.length, k - mk);
    } else {
        return longerArray[mk - 1];
    }
}

最后附上官方解决方法,没有使用递归。https://leetcode.com/articles/median-of-two-sorted-arrays/

附上其他解决此题的方法,部分算法不符合O(log (m+n))要求。http://blog.csdn.net/whucyl/article/details/23524045

版权声明:本文为博主原创文章,未经博主允许不得转载。

《LeetBook》leetcode题解(4): Median of Two Sorted Arrays[H]——两个有序数组中值问题

004. Median of Two Sorted Arrays[H]Median of Two Sorted ArraysH 题目 分析 思路1 思路2 预备知识 先解释下割 双数组找第k个元素 我...
  • hk2291976
  • hk2291976
  • 2016年04月09日 21:24
  • 2738

两个有序数组的中位数Median of Two Sorted Arrays(很重要)

https://leetcode.com/problems/median-of-two-sorted-arrays/ 对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1]...
  • gao1440156051
  • gao1440156051
  • 2016年06月21日 11:11
  • 3715

leetcode之 median of two sorted arrays

这是我做的第二个leetcode题目,一开始以为和第一个一样很简单,但是做的过程中才发现这个题目非常难,给人一种“刚上战场就踩上地雷挂掉了”的感觉。后来搜了一下leetcode的难度分布表(leetc...
  • yutianzuijin
  • yutianzuijin
  • 2013年09月10日 00:15
  • 78645

leetcode: 4. Median of Two Sorted Arrays (java)

题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/ 题目: There are two sorted arrays nu...
  • j754379117
  • j754379117
  • 2016年06月20日 20:44
  • 563

leetcode04-Median of Two Sorted Arrays-python

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two...
  • summerdj
  • summerdj
  • 2016年03月31日 15:11
  • 789

leetcode之Median of Two Sorted Arrays问题

问题描述: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of t...
  • xu2645318400
  • xu2645318400
  • 2017年06月29日 18:49
  • 170

LeetCode(4)Median of Two Sorted Arrays

题目There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the t...
  • fly_yr
  • fly_yr
  • 2015年08月22日 20:35
  • 1214

Median of Two Sorted Arrays 两个有序数组的中位数@LeetCode

超级难的一道题,线性时间复杂度好做,就是merge。 但是对数复杂度,就要用到很多数学分析,实际上就是要找到第k小的元素。 翻遍了网络,觉得还是这一篇讲的最详细,而且写得代码最容易转为Java,因为J...
  • hellobinfeng
  • hellobinfeng
  • 2013年12月16日 13:52
  • 4686

LeetCode 第二题,Median of Two Sorted Arrays

题目再现 There are two sorted arrays A and B of size m and n respectively. Find the median of the two so...
  • hu1020935219
  • hu1020935219
  • 2014年08月02日 17:18
  • 2281

4. Median of Two Sorted Arrays(归并排序思想)

原题 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th...
  • daigualu
  • daigualu
  • 2017年06月10日 14:00
  • 2167
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Median of Two Sorted Arrays(获取两个有序数列的中值)
举报原因:
原因补充:

(最多只允许输入30个字)