IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode(Python实现)—寻找两个有序数组的中位数 -> 正文阅读

[数据结构与算法]LeetCode(Python实现)—寻找两个有序数组的中位数

4.寻找两个有序数组的中位数

题目大意

给定两个大小为 m 和 n 的有序数组 nums1nums2

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

题目假设 nums1nums2 不会同时为空。

解题思路

根据题目要求,时间复杂度为 O ( l o g ( m + n ) ) O(log(m + n)) O(log(m+n)),因此无法使用归并排序再查找中位数的方法,需要采用二分查找法。又因题目中所给的数组为有序数组,所以可以将问题简化为寻找两个数组中第k小的数。通过比较A[(m + n) / 2 - 1]B[(m + n) / 2 - 1],对数组中的数字进行排除并更新k值。

例如:
m + n = 14k初始为7,比较A数组和B数组中的第三个元素即A[2]B[2]的大小。
1比较之后,值更小的数组去除第三个元素以及前面的元素,并更新k值,此时k = k - 去掉的元素个数,然后重复上述过程。
2PS: 遇到相同值时随机选取一边进行删除
3最后当k = 1时,中位数即为当前两个数组的最小值min{A[k],B[k]}
4

代码

def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        def getKthValue(k):
            # index 为数组的左边界
            index1, index2 = 0, 0
            while True:
                if index1 == m:
                    # 左边界 + K - 1
                    return nums2[index2 + k - 1]
                if index2 == n:
                    return nums1[index1 + k - 1]
                if k == 1:
                    return min(nums1[index1], nums2[index2])

                newIndex1 = min(index1 + k // 2 - 1, m - 1)
                newIndex2 = min(index2 + k // 2 - 1, n - 1)
                value1, value2 = nums1[newIndex1], nums2[newIndex2]
                if value1 <= value2:
                    # k 减去'删除掉的元素个数'
                    k -= newIndex1 - index1 + 1
                    # 修改左边界
                    index1 = newIndex1 + 1
                else:
                    k -= newIndex2 - index2 + 1
                    index2 = newIndex2 + 1
        m, n = len(nums1), len(nums2)
        length = m + n
        if length % 2 == 1:
            return getKthValue((length + 1) // 2)
        else:
            return (getKthValue((length // 2)) + getKthValue(length // 2 + 1)) / 2
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-10 11:18:39  更:2021-12-10 11:20:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 19:00:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码