博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
两个有序数列,求中间值 Median of Two Sorted Arrays
阅读量:5214 次
发布时间:2019-06-14

本文共 1862 字,大约阅读时间需要 6 分钟。

原题:

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

题目大意:给出两个有序的数字列表,长度分别为m,n。找到这两个列表中的中间值。(第一次出现了时间复杂度的要求噢)

例如:

#例子一:总长度为奇数nums1 = [1, 3]nums2 = [2]The median is 2.0#例子二:总长度为偶数nums1 = [1, 2]nums2 = [3, 4]The median is (2 + 3)/2 = 2.5

仔细分析题目,nums1和nums2都已经是排好序了的,这就大大的降低了难度,让找到两个列表的中间值,其实我们可以拓展为找到两个列表的第k个值。当然这个是拓展部分了,对于这个题目,有不同的思路,最简单粗暴的就是将两个列表合并,之后进行排序,拍好序后进行寻找中间值就简单了。但是用传统的先合并再排序,效率想必会很低~

我们发现对于两个已经有序的列表(从小到大),其实有一个更优的排序方式:从小到大,依次进行列表元素的比较(为方便表述,小詹称两个列表为A,B),较小值放到一个新列表中,比如A中该位置的值较小,将其放到新的列表C中,同时将A列表下一个值继续与B中当前位置元素进行比较,以此类推。这样的比较次数就比先合并在排序小很多啦!代码如下:

def findMedianSortedArrays(nums1, nums2):    """    :type nums1: List[int]    :type nums2: List[int]    :rtype: float    """    # 创建新列表    nums3 = []    # 当输入两个列表都还存在元素没进行比较的时候,循环进行对比    # 并将较小值放入新列表,同时较小元素的列表和新列表索引加一    while len(nums1) and len(nums2):        if nums1[0] < nums2[0]:            nums3.append(nums1.pop(0))        else:            nums3.append(nums2.pop(0))    # 当存在某一个列表所有元素已经比较完,即拍好了序    # 剩下那个列表剩下的值直接放入新列表对应位置即可    nums3.extend(nums1)    nums3.extend(nums2)    # 注意‘/’和‘//’的区别:    # 前者结果为float类型,后者为整除,结果为int型    len_3 = len(nums3)    # ‘%’为取模运算,即看长度是否被2整除,即看偶数还是奇数    if len_3 % 2 != 0:        return nums3[(len_3 - 1) // 2]    return (nums3[len_3 // 2 - 1] + nums3[len_3 // 2]) / 2

 另一种方法:

def findMedianSortedArrays(self, nums1, nums2):        """        :type nums1: List[int]        :type nums2: List[int]        :rtype: float        """        # 添加列表2到列表1,然后排序        nums1.extend(nums2)        nums1.sort()                # 取中位数,分长度为奇数和偶数的情况        if len(nums1) % 2 == 0:            return (nums1[len(nums1) // 2 - 1] + nums1[len(nums1) // 2]) / 2        else:            return nums1[len(nums1) // 2]

 

转载于:https://www.cnblogs.com/tianqizhi/p/9526812.html

你可能感兴趣的文章
实用的VMware虚拟机使用技巧十一例
查看>>
监控工具之---Prometheus 安装详解(三)
查看>>
Azure Iaas基础之---创建虚拟机
查看>>
不错的MVC文章
查看>>
网络管理相关函数
查看>>
IOS Google语音识别更新啦!!!
查看>>
20190422 T-SQL 触发器
查看>>
[置顶] Linux终端中使用上一命令减少键盘输入
查看>>
poj1422_有向图最小路径覆盖数
查看>>
BootScrap
查看>>
[大牛翻译系列]Hadoop(16)MapReduce 性能调优:优化数据序列化
查看>>
WEB_点击一百万次
查看>>
CodeForces - 878A Short Program(位运算)
查看>>
路冉的JavaScript学习笔记-2015年1月23日
查看>>
Mysql出现(10061)错误提示的暴力解决办法
查看>>
2018-2019-2 网络对抗技术 20165202 Exp3 免杀原理与实践
查看>>
NPM慢怎么办 - nrm切换资源镜像
查看>>
CoreData 从入门到精通(四)并发操作
查看>>
Swift - UIView的常用属性和常用方法总结
查看>>
Swift - 异步加载各网站的favicon图标,并在单元格中显示
查看>>