博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
两个有序数组求中位数log(m+n)复杂度
阅读量:5994 次
发布时间:2019-06-20

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

leetcode 第4题

中位数技巧:

对于长度为L的有序数组,它的中位数是(a[ceil((L+1)/2)]+a[floor((L+1)/2)])/2

算法原理:

类似三分法求极值
两个人都前进,谁前进之后比较小,就让谁前进。

import mathclass Solution(object):    def findpos(self, x, nums1, nums2):        a, b = 0, 0        l = len(nums1) + len(nums2)        while a + b < x:            # print(a, b, '==')            if a == len(nums1):                b = x - a                break            if b == len(nums2):                a = x - b                break            step = math.ceil((x - a - b) / 2)            pos1 = min(a + step, len(nums1))            pos2 = min(b + step, len(nums2))            v1 = nums1[pos1 - 1]            v2 = nums2[pos2 - 1]            if v1 < v2:                a = pos1            else:                b = pos2        if a == 0:            return nums2[b - 1]        elif b == 0:            return nums1[a - 1]        else:            return max(nums1[a - 1], nums2[b - 1])    def findMedianSortedArrays(self, nums1, nums2):        """        :type nums1: List[int]        :type nums2: List[int]        :rtype: float        """        l = len(nums1) + len(nums2)        return (self.findpos(math.floor((l + 1) / 2), nums1, nums2) + self.findpos(math.ceil((l + 1) / 2), nums1,nums2)) / 2

转载地址:http://adqlx.baihongyu.com/

你可能感兴趣的文章
蓝桥杯练习系统——基础练习 十六进制转十进制
查看>>
ionic3+angular4+cordova 项目实例
查看>>
tracepath 路由跟踪命令
查看>>
(转)设计模式——观察者模式
查看>>
Jar包冲突解决方法
查看>>
彻底搞清楚Java并发 (一) 基础
查看>>
SQL疑难杂症【3】链接服务器提示"无法启动分布式事物"
查看>>
Windows Mobile和Wince(Windows Embedded CE)下如何封装Native DLL提供给.NET Compact Framework进行调用...
查看>>
数据库相关
查看>>
HDU Count the string (KMP)
查看>>
C#中的泛型
查看>>
编程之美4:求数组中的最大值和最小值
查看>>
ios7新增基础类库以及OC新特性
查看>>
[LeetCode] Maximal Square
查看>>
代码设置TSQLCONNECTION参数
查看>>
DataTable 的用法简介
查看>>
步步为营 .NET 代码重构学习笔记系列总结
查看>>
BROKER服务器同客户端和应用服务器三者之间传递消息的格式定义
查看>>
【转】20个Cydia常见错误问题解决方法汇总
查看>>
使用jQuery和Bootstrap实现多层、自适应模态窗口
查看>>