[LeetCode]题解(python):004-Median of Two Sorted Arrays
题目来源:
https://leetcode.com/problems/median-of-two-sorted-arrays/
题意分析:
这道题目是输入两个已经排好序的数组(长度为m,n),将这两个数组整合成一个数组,输出新数组的中位数。要求时间复杂度是(log(m + n)。比如如果输入[1,2,3],[3,4,5]。那么得到的新数组为[1,2,3,3,4,5]得到的中位数就是3.
题目思路:
由于题目要求的时间复杂度是(log(m+n)),如果我们直接把两个数组整合一起,那么时间复杂度肯定超过(log(m+n))。所以整理肯定是不行的。那么还有什么方法吗?答案是肯定的。
首先我们要先了解中位数的概念,中位数就是有序数组的中间那个数。那么如果我们将比中位数小的数和比中位数大的数去掉同样的个数,中位数的值也不会变化(数组的个数为偶数的时候另外讨论,因为那时候中位数是中间两个数的平均值,所以中位数旁边两个数不能去掉)。
所以我们不妨试着将数组长度不断缩短。这里不妨提出一个引理。假设有两个有序数组am,bn,他们整合后的有序数组为cn+m。他们的中位数分别是am/2,bn/2,c(m+n)/2。如果am/2 < bn/2,则 a0…m/2 <= c(m+n)/2 <= bn/2…n 。
引理证明:
假设 am/2 > c(m+n)/2 ,那么 bn/2 > c(m+n)/2,所以在数组am里有大于m/2个数大于c(m+n)/2,在数组bn里也有n/2个数大于c(m+n)/2
也就是说在cn+m里有(m+n)/2个数大于c(m+n)/2,此时就c(m+n)/2不再是数组cn+m的中位数。
所以a0…m/2 <= c(m+n)/2。
同理可得c(m+n)/2 <= bn/2…n 。
根据上述引理,我们不妨设m>n,那么我们根据判断两个数组的中位数大小,每个数组每次减少n/2长度,直到n为1。如此,我们通过减少log(n)次可以得到答案。这种方法的时间复杂度是(log(min(m,n)))。
代码(python):
class Solution(object):
def getMedian(self,nums):
size = len(nums)
if size == 0:
return [0,0]
if size % 2 == 1:
return [nums[size // 2],size // 2]
return [(float(nums[size // 2 - 1] + nums[size // 2])) / 2,size // 2] def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
size1 = len(nums1)
size2 = len(nums2)
if size1 < size2:
return self.findMedianSortedArrays(nums2,nums1)
m1 = self.getMedian(nums1)
m2 = self.getMedian(nums2)
if size2 == 0:
return m1[0]
if size2 == 1:
if size1 == 1:
return (float(nums1[0] + nums2[0])) / 2
if size1 % 2 == 0:
if nums2[0] < nums1[size1 //2 - 1]:
return nums1[size1 // 2 - 1]
if nums2[0] > nums1[size1 // 2 ]:
return nums1[size1 // 2]
else:
return nums2[0]
else:
if nums2[0] < nums1[size1 // 2 - 1]:
return (float(nums1[size1 // 2 - 1] + nums1[size1 // 2])) / 2
if nums2[0] > nums1[size1 // 2 + 1]:
return (float(nums1[size1 // 2] + nums1[size1 // 2 + 1])) / 2
else:
return (float(nums2[0] + nums1[size1 // 2])) / 2
if size2 % 2 == 0:
if size1 % 2 == 0:
if nums2[size2 // 2 - 1] < nums1[size1 //2 - 1] and nums2[size2 // 2] > nums1[size1 // 2]:
return m1[0]
if nums1[size1 // 2 - 1] < nums2[size2 // 2 - 1] and nums1[size1 // 2] > nums2[size2 // 2]:
return m2[0]
if m1[0] < m2[0]:
return self.findMedianSortedArrays(nums1[m2[1]:],nums2[:size2 - m2[1]])
if m1[0] > m2[0]:
return self.findMedianSortedArrays(nums1[:size1 - m2[1]],nums2[m2[1]:])
else:
return m1[0]
PS:当两个数组长度都是偶数的时候,由于中位数和中间两个数相关,如果直接删减有可能把中位数的数值发生改变,比如:[1,6],[4,5],这种情况如果用上述算法,那么先得到[1],[4]最后得到2.5,然后最后答案应该是4.5,所以这种情况要另外讨论。
还有,用python3.0要注意语法的不同,因为判断系统是用2.7的算法。3.0的’/’默认是浮点数,而在‘2.7’如果原来是整型的时候是整除。
转载请注明出处:http://www.cnblogs.com/chruny
[LeetCode]题解(python):004-Median of Two Sorted Arrays的更多相关文章
- LeetCode 004 Median of Two Sorted Arrays
题目描述:Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. F ...
- Kotlin实现LeetCode算法题之Median of Two Sorted Arrays
题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...
- No.004 Median of Two Sorted Arrays
4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...
- LeetCode--No.004 Median of Two Sorted Arrays
4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...
- LeetCode 第四题 Median of Two Sorted Arrays 二人 渣渣选手乱七八糟分析发现基本回到思路1
题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...
- 【LeetCode】004. Median of Two Sorted Arrays
题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...
- 【JAVA、C++】LeetCode 004 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 ...
- 【LeetCode】4、Median of Two Sorted Arrays
题目等级:Hard 题目描述: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find t ...
- 004 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 ...
- 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 ...
随机推荐
- [Effective Modern C++] Item 7. Distinguish between () and {} when creating objects - 辨别使用()与{}创建对象的差别
条款7 辨别使用()与{}创建对象的差别 基础知识 目前已知有如下的初始化方式: ); ; }; }; // the same as above 在以“=”初始化的过程中没有调用赋值运算,如下例所示: ...
- 在vs.net c#中添加mysql模型
http://weblogs.asp.net/gunnarpeipman/getting-mysql-work-with-entity-framework-4-0 http://dev.mysql.c ...
- SQL Server中的PWDENCRYPT与PWDCOMPARE函数
前幾天有個客戶的網站出問題(不是我們開發的),請我們幫他看,主要的問題是他們的網站會員在進行查詢密碼時,會員收到信的時候在密碼的欄位竟然會出現 System.Binary[] 字樣.而我進去資料庫中查 ...
- Dom4j使用Xpath语法读取xml节点
我们可以使用Xpath的语法来轻易的读取xml的某个节点[类似于jQuery的选择器]: 使用Xpath语法需要添加新的jaxen-1.1-beta-7.rar 这个jar包 dom4j完整jar包我 ...
- wxwidgets demo
环境说明: IOS: mac 10.9 wx: wxWidgets-2.9.5 (http://www.wxwidgets.org/downloads/) gcc: $gcci686-apple- ...
- {A} + {B}(unique水)
{A} + {B} Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 12款最佳Linux命令行终端工具
12款最佳Linux命令行终端工具 如果你跟我一样,整天要花大量的时间使用Linux命令行,而且正在寻找一些可替代系统自带的老旧且乏味的终端软件,那你真是找对了文章.我这里搜集了一些非常有趣的终端软件 ...
- bzoj2719[Violet 4]银河之星
Description Input Output 一道坑爹的搜索……题意是可以往任意方向移动3格,或者如果旁边有格子的时候可以越过它移动,然后把它吃掉.要求吃到最后一个的位置在x0,y0 注意到可以越 ...
- poj 1083 Moving Tables_dp
题意:给你n个凳子,接着告诉你一个凳子从a房间到b房间,运输时间为10分钟,走廊很窄能通过一张凳子,当然不堵塞的话能同时扮凳子,问最小花费多少时间 因为数据很小就直接用数组统计了,a,b如果是奇数的话 ...
- 窥探 kernel --- 进程调度的目标,nice值,静态优先级,动态优先级,实时优先级
http://blog.chinaunix.net/uid-24227137-id-3595610.html 窥探 kernel --- 进程调度的目标,nice值,静态优先级,动态优先级,实时优先级 ...