Median of Two Sorted Arrays(获取两个有序数列的中值)
Posted 王三的猫阿德
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Median of Two Sorted Arrays(获取两个有序数列的中值)相关的知识,希望对你有一定的参考价值。
转载注明出处: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
以上是关于Median of Two Sorted Arrays(获取两个有序数列的中值)的主要内容,如果未能解决你的问题,请参考以下文章
leedcode Median of Two Sorted Arrays
#Leetcode# 4. Median of Two Sorted Arrays
LeetCode: Median of Two Sorted Arrays
** Median of Two Sorted Arrays