设为首页 收藏本站
查看: 818|回复: 0

[经验分享] [LeetCode]题解(python):004-Median of Two Sorted Arrays

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-29 09:45:24 | 显示全部楼层 |阅读模式


题目来源:
  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):


DSC0000.gif DSC0001.gif


1 class Solution(object):
2     def getMedian(self,nums):
3         size = len(nums)
4         if size == 0:
5             return [0,0]
6         if size % 2 == 1:
7             return [nums[size // 2],size // 2]
8         return [(float(nums[size // 2 - 1] + nums[size // 2])) / 2,size // 2]
9         
10     def findMedianSortedArrays(self, nums1, nums2):
11         """
12         :type nums1: List[int]
13         :type nums2: List[int]
14         :rtype: float
15         """
16         size1 = len(nums1)
17         size2 = len(nums2)
18         if size1 < size2:
19             return self.findMedianSortedArrays(nums2,nums1)
20         m1 = self.getMedian(nums1)
21         m2 = self.getMedian(nums2)
22         if size2 == 0:
23             return m1[0]
24         if size2 == 1:
25             if size1 == 1:
26                 return (float(nums1[0] + nums2[0])) / 2
27             if size1 % 2 == 0:
28                 if nums2[0] < nums1[size1 //2 - 1]:
29                     return nums1[size1 // 2 - 1]
30                 if nums2[0] > nums1[size1 // 2 ]:
31                     return nums1[size1 // 2]
32                 else:
33                     return nums2[0]
34             else:
35                 if nums2[0] < nums1[size1 // 2 - 1]:
36                     return (float(nums1[size1 // 2 - 1] + nums1[size1 // 2])) / 2
37                 if nums2[0] > nums1[size1 // 2 + 1]:
38                     return (float(nums1[size1 // 2] + nums1[size1 // 2 + 1])) / 2
39                 else:
40                     return (float(nums2[0] + nums1[size1 // 2])) / 2
41         if size2 % 2 == 0:
42             if size1 % 2 == 0:
43                 if nums2[size2 // 2 - 1] < nums1[size1 //2 - 1] and nums2[size2 // 2] > nums1[size1 // 2]:
44                     return m1[0]
45                 if nums1[size1 // 2 - 1] < nums2[size2 // 2 - 1] and nums1[size1 // 2] > nums2[size2 // 2]:
46                     return m2[0]
47         if m1[0] < m2[0]:
48             return self.findMedianSortedArrays(nums1[m2[1]:],nums2[:size2 - m2[1]])
49         if m1[0] > m2[0]:
50             return self.findMedianSortedArrays(nums1[:size1 - m2[1]],nums2[m2[1]:])
51         else:
52             return m1[0]
View Code  

  PS:当两个数组长度都是偶数的时候,由于中位数和中间两个数相关,如果直接删减有可能把中位数的数值发生改变,比如:[1,6],[4,5],这种情况如果用上述算法,那么先得到[1],[4]最后得到2.5,然后最后答案应该是4.5,所以这种情况要另外讨论。
  还有,用python3.0要注意语法的不同,因为判断系统是用2.7的算法。3.0的’/’默认是浮点数,而在‘2.7’如果原来是整型的时候是整除。

  转载请注明出处:http://www.cnblogs.com/chruny

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144808-1-1.html 上篇帖子: Python中的类(中) 下篇帖子: 2015/11/4用Python写游戏,pygame入门(4):获取鼠标的位置及运动
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表