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:4. 寻找两个正序数组的中位数(Python) -> 正文阅读

[数据结构与算法]力扣Leetcode:4. 寻找两个正序数组的中位数(Python)

题目描述

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

题解

由于时间复杂度要求,所以要用二分查找(看到log与有序数组,所以必然是二分)、且不要考虑合并两个有序数组为一个数组(只要合并了,复杂度至少是O(m+n))。

一个直观的思路是,将该问题转换为求第k大的数的问题。但由于这儿有两个有序数组A与B,因此我们首先比较A[k/2]与B[k - k/2 - 1]这两个元素的大小,较小者及其同一数组内之前的元素中一定不会存在目标元素,可以直接去掉——我们的“二分”就体现在这里。相较于“每次保留一半”,我们这里的做法是“每次排除一半”。

为什么下标pos1 = k/2对应下标pos2 = k - k/2 - 1呢?这是因为,如果A[pos1] < B[pos2], 那么A[l1 … pos1]中必然不存在第k大的数字!

需要注意的细节有:

  • 如果所有元素为偶数个,需要找两个位置之后求平均值。
  • 如果一个数组内没有那么多元素,此时直接将该数组内最后一个元素与另一数组内的对应位置(第一个数组内的位置i对应第二个数组内的位置k-i-1,这两个位置的元素如果相等,那它们刚好是目标位置)元素比较。
  • k到底指的是第k个、还是下标为k,需要想清楚。我在代码里的k指的下标为k。
  • k是绝对位置还是相对位置,需要想清楚。我在代码里的k为相对位置,需要加上l之后才表示真实位置。

边界条件为:

  • k为1时,仅需比较一次之后返回较小者即可。
  • 当其中一个数组为空时,只需要在另一数组中返回位置k的元素即可。

代码(Python)

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        m, n = len(nums1), len(nums2)
        return (self.binary_find(nums1, 0, m-1, nums2, 0, n-1, (m+n)//2 - 1) +
                self.binary_find(nums1, 0, m-1, nums2, 0, n-1, (m+n)//2)) / 2 if (m+n) % 2 == 0 \
            else self.binary_find(nums1, 0, m-1, nums2, 0, n-1, (m+n)//2)

    def binary_find(self, nums1, l1, r1, nums2, l2, r2, k) -> float:
        if l1 > r1:
            return nums2[l2 + k]
        elif l2 > r2:
            return nums1[l1 + k]
        if k == 0:
            return min(nums1[l1], nums2[l2])
        if (r1 - l1) < (r2 - l2):
            pos1 = k//2 if l1+k//2 <= r1 else r1-l1
            pos2 = k - pos1 - 1
        else:
            pos2 = k//2 if l2+k//2 <= r2 else r2-l2
            pos1 = k - pos2 - 1
        if nums1[l1 + pos1] == nums2[l2 + pos2]:
            return nums1[l1 + pos1]
        elif nums1[l1 + pos1] < nums2[l2 + pos2]:
            return self.binary_find(nums1, l1 + pos1 + 1, r1, nums2, l2, r2, k - (pos1 + 1))
        else:
            return self.binary_find(nums1, l1, r1, nums2, l2 + pos2 + 1, r2, k - (pos2 + 1))
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:42:57  更:2022-04-09 18:45:34 
 
开发: 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/26 10:02:40-

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