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) -> 正文阅读

[数据结构与算法]【LeetCode 二分查找专项】寻找两个正序数组的中位数(4)

1. 题目

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2 。请你找出并返回这两个正序数组的中位数 。要求总的时间复杂度必须为 O ( l o g ( m + n ) ) O(log (m+n)) O(log(m+n))

1.1 示例

  • 示例 1:
  • 输入: nums1 = [1, 3]nums2 = [2]
  • 输出: 2.00000 2.00000 2.00000
  • 解释: 合并数组 = [1, 2, 3] ,中位数 2 2 2
  • 示例 2:
  • 输入: nums1 = [1, 2]nums2 = [3, 4]
  • 输出: 2.50000 2.50000 2.50000
  • 解释: 合并数组 = [1, 2, 3, 4] ,中位数 ( 2 + 3 ) / 2 = 2.5 (2 + 3) / 2 = 2.5 (2+3)/2=2.5
  • 示例 3:
  • 输入: nums1 = [0, 0]nums2 = [0, 0]
  • 输出: 0.00000 0.00000 0.00000
  • 示例 4:
  • 输入: nums1 = []nums2 = [1]
  • 输出: 1.00000 1.00000 1.00000
  • 示例 5:
  • 输入: nums1 = [2]nums2 = []
  • 输出: 2.00000 2.00000 2.00000

1.2 说明

1.3 提示

  • n u m s 1. l e n g t h = = m nums1.length == m nums1.length==m
  • n u m s 2. l e n g t h = = n nums2.length == n nums2.length==n
  • 0 ≤ m ≤ 1000 0 \le m \le 1000 0m1000
  • 0 ≤ n ≤ 1000 0 \le n \le 1000 0n1000
  • 1 ≤ m + n ≤ 2000 1 \le m + n \le 2000 1m+n2000
  • ? 1 0 6 ≤ n u m s 1 [ i ] , n u m s 2 [ i ] ≤ 1 0 6 -10^6 \le nums1[i], nums2[i] \le 10^6 ?106nums1[i],nums2[i]106

2. 题解一(堆排序)

2.1 分析

先排序再计算中位数。

2.2 解答

from typing import List


class Solution:
    def _down_heap(self, arr: List[int], num, j):
        """
        通过元素交换,确保列表arr[0:num]中,元素arr[j]及其子孙节点满足堆序性质
        :param arr: 列表形式给出的待排序列
        :param num: 列表索引上限
        :param j: 列表元素的索引
        :return: None
        """
        left = 2 * j + 1  # 元素arr[j]左子节点的索引
        right = 2 * j + 2  # 元素arr[j]右子节点的索引
        if left < num:  # 判断arr[j]是否有左子节点
            large_child = left
            if right < num:  # 判断arr[j]是否有右子节点
                if arr[right] > arr[left]:
                    large_child = right
            if arr[large_child] > arr[j]:  # 确保最终建成最大堆
                arr[large_child], arr[j] = arr[j], arr[large_child]  # 交换两个节点处的值使满足堆序性质
                self._down_heap(arr, num, large_child)

    def heapify(self, arr: List[int]):
        """将列表形式给出的元素视为完全二叉树,对其进行建堆"""
        for j in range((len(arr) - 1) // 2, -1, -1):  # 建堆
            self._down_heap(arr, len(arr), j)

    def heap_sort(self, arr: List[int]):
        """堆排序"""
        self.heapify(arr)  # 构建最大堆
        # 依次将最大值,次大值...最小值从右往左排好
        for i in range(len(arr) - 1, 0, -1):  # 到0而非-1是为了避免下面出现arr[0], arr[0] = arr[0], arr[0]这一无谓操作
            arr[i], arr[0] = arr[0], arr[i]  # 每一次迭代,将当前堆中最大元素排好序
            self._down_heap(arr, i, 0)  # 每迭代一次后第i+1个元素arr[i]已排好序,仅需确保前i个元素满足堆序性质

    def find_median_sorted_arrays(self, nums1: List[int], nums2: List[int]) -> float:
        nums = nums1 + nums2
        self.heapify(nums)
        self.heap_sort(nums)
        if len(nums) % 2 == 1:
            return float(nums[len(nums) // 2])
        else:
            return float((nums[len(nums) // 2 - 1] + nums[len(nums) // 2]) / 2)


def main():
    sln = Solution()
    nums1 = [1, 3]
    nums2 = [2]
    print(sln.find_median_sorted_arrays(nums1, nums2))  # 2.0


if __name__ == '__main__':
    main()

  • 执行用时: 132 ms , 在所有 Python3 提交中击败了 5.65% 的用户;
  • 内存消耗: 15.2 MB , 在所有 Python3 提交中击败了 27.76% 的用户
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-23 16:56:46  更:2021-08-23 16:57:29 
 
开发: 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/25 22:54:17-

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