【 腾讯精选练习 50 题】09—寻找两个正序数组的中位数【困难】

简介: 【 腾讯精选练习 50 题】09—寻找两个正序数组的中位数【困难】

题目链接

4. 寻找两个正序数组的中位数【困难】

题目简介

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

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

示例 3:

输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000

题目解析

  1. 题目要求的时间复杂度为 O(Log(m + n)),也就是指明了该算法只能使用 二分查找
  2. 我们假设num1的数组长度为 m,num2的数组长度为n
  • 如果 m + n 为偶数的话,那么 中位数 = (m + n)/ 2 相当于 (m + n + 1) / 2
  • 如果 m + n 为奇数的话,那么 中位数 = (m + n + 1)/ 2
  1. 我们定义 i 和 j 分别指向我们的 num1 和 num2
  • i 初始值为我们 num1 的中位数,j 初始值为我们 num2 的中位数
  • 我们需要找到这样的一根假想线,且 线左边的数值 小于 线右边的数值,也相当于 num1[i - 1] <= num2[j] && num2[j - 1] <= num1[i],满足这个条件,既可以找到我们的中位数
  1. 最后,我们只需要根据 m + n 的奇偶性,来得出最后的中位数即可

题目代码

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
      // 交换下数组的值,让小一点的数组在上面
        if(nums1.length > nums2.length){
            int[] temp = nums1;
            nums1 = nums2;
            nums2 = temp;
        }
        int len1 = nums1.length;
        int len2 = nums2.length;
    // 求出两个数组的中位数
        int toall = (len1 + len2 + 1) / 2;
        int left = 0;
        int right = len1;
        while(left < right){
          // 这里为什么要 right + left + 1 ?
          // 如果我们写 right + left
          // 假设 left = 4, right = 5
          // 这种的话,i 一直等于 4,且由于 left = i ,造成无限循环
            int i = (right + left + 1) / 2;
            int j = toall - i;
            if(nums1[i - 1] > nums2[j]){
                right = i - 1;
            }else{
                left = i;
            }
        }
        int i = (right + left + 1) / 2;
        int j = toall - i;
        // 左边的肯定要最大的 右边的要最小的
        int leftNum1 = (i == 0 ? Integer.MIN_VALUE : nums1[i - 1]);
        int rightNum1 = (i == len1 ? Integer.MAX_VALUE : nums1[i]);
        int leftNum2 = (j == 0 ? Integer.MIN_VALUE : nums2[j - 1]);
        int rightNum2 = (j == len2 ? Integer.MAX_VALUE : nums2[j]);
        if((len1 + len2) % 2 == 1){
            return Math.max(leftNum1, leftNum2);
        }else{
            return ((double)(Math.max(leftNum1, leftNum2) + Math.min(rightNum1, rightNum2))) / 2;
        }
    }
}


相关文章
|
网络协议 算法 数据库
|
7月前
|
SQL 自然语言处理 BI
另辟蹊径的 Text2SQL,不用大模型也能搞 chatBI
润乾报表NLQ组件摒弃大模型路线,采用规则词典与领域知识库,将自然语言精准转化为MQL查询语言,实现稳定、低成本、可维护的ChatBI。其核心在于结构化语义解析,避免“幻觉”,支持复杂多表关联与计算,适用于企业级BI场景,是可靠高效的自然语言查询解决方案。
|
7月前
|
Rust 安全 测试技术
智能合约开发语言对比与选择
本文系统构建智能合约语言对比框架,涵盖安全性、成本、生态等维度,提出加权评分模型与结构化分析方法,对比Solidity、Vyper、Move、Rust、Cadence等语言特性,结合团队能力与业务场景,提供量化选型指引。(238字)
|
安全 数据安全/隐私保护 Windows
配置用户通过Telnet登录设备认证示例
本文介绍了通过AAA本地认证配置Telnet登录设备的组网需求、配置思路及操作步骤。企业管理员可借助此方案实现简单、安全的远程设备管理。具体包括:配置LSW1接口IP地址,使能Telnet服务器功能,设置VTY用户界面验证方式为AAA,以及创建本地用户并分配权限。最终验证显示,管理员可通过输入正确用户名和密码成功以Telnet方式登录设备。
配置用户通过Telnet登录设备认证示例
|
11月前
|
机器学习/深度学习 传感器 运维
设备总是坏才修?你落伍啦,预测性运维才是王炸!
设备总是坏才修?你落伍啦,预测性运维才是王炸!
489 5
|
存储 分布式计算 物联网
美的楼宇科技基于阿里云 EMR Serverless Spark 构建 LakeHouse 湖仓数据平台
美的楼宇科技基于阿里云 EMR Serverless Spark 建设 IoT 数据平台,实现了数据与 AI 技术的有效融合,解决了美的楼宇科技设备数据量庞大且持续增长、数据半结构化、数据价值缺乏深度挖掘的痛点问题。并结合 EMR Serverless StarRocks 搭建了 Lakehouse 平台,最终实现不同场景下整体性能提升50%以上,同时综合成本下降30%。
1111 58
|
机器学习/深度学习 人工智能 运维
机器学习+自动化运维:让服务器自己修Bug,运维变轻松!
机器学习+自动化运维:让服务器自己修Bug,运维变轻松!
582 14
|
关系型数据库 MySQL
MySql 计算两个日期的时间差函数
MySql计算两个日期的时间差函数 MySql计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 说明: 返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差。
13820 1
|
缓存 边缘计算 安全
全面进化:边缘安全加速平台的演进(暨新产品ESA发布会)
全面进化:边缘安全加速平台(ESA)发布会。ESA融合了全球3200个节点、TP级防护、四层和七层安全加速,提供一站式的CDN与安全服务。产品具备高性能双向传输、智能调度、免费SSL证书、DNS管理及边缘计算能力,支持电商、游戏等多场景。发布会还介绍了行业标准及价格体系,涵盖从个人开发者到大型企业的多种套餐,助力用户享受高效、稳定的边缘加速与安全防护体验。
822 3