LeetCode寻找两个有序数组的中位数打败100%人

news2024/9/25 4:26:44

😀前言
在本文中,我们将深入研究一种复杂的算法问题:查找两个有序数组的中位数。这是一个经典的计算问题,通常出现在编程面试和算法挑战中。我们将首先探讨一种常见的暴力解决方法,然后逐步引入更高效的解决方案,最终理解并实现官方的二分法算法。通过本文,您将获得对这一重要算法问题的深刻理解。

🏠个人主页:尘觉主页
在这里插入图片描述

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

在csdn获奖荣誉: 🏆csdn城市之星2名
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 💓Java全栈群星计划top前5
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🤗 端午大礼包获得者
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🥰阿里云专家博主
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 😉亚马逊DyamoDB结营

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

文章目录

    • 寻找两个有序数组的中位数
      • 自己思路
      • 官方思路
        • 🥰重点分析getKthElement方法
          • 总结
    • 😄总结

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

自己思路

就是暴力破解或者是数组合并然后排序

看不得还是分析官方打败100%的吧

class Solution {
       public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int l=nums1.length+nums2.length;
        int[] c = new int[l];
        for (int i = 0; i < nums1.length; i++) {
            c[i]=nums1[i];
        }
        for (int i =0,j=nums1.length; i <nums2.length; i++,j++) {
            c[j]=nums2[i];
        }
        Arrays.sort(c);
        if (l % 2 != 0) {
            return c[l / 2 ];
        } else {
            return (double) (c[l / 2] + c[l / 2 - 1]) / 2.0;
        }
    }
}

官方思路

在这里插入图片描述

int midIndex = totalLength / 2; 这个意思是当二个数组的和是奇数时取中间的数

注意为什么后面需要+1 如 1 2 3是合为3但是我们上面/2的结果在java里面是1又因为我们需要中为数 所以我们在调用下面的函数的时候需要+1

当偶数的时候同理

🥰重点分析getKthElement方法

index1和index2官方没有解释说 这里我来分析一下 这个可以指的是老地址 也就是初始地址

因为后面我们需要排除前面的元素怎么排除呢 我们可以通过在增加一个地址 即为新地址

newIndex1和newIndex2来表示新地址

half这个相当于比k还一半的数那来截取

举个例子就明白了

假设两个有序数组如下:

在这里插入图片描述

两个有序数组的长度分别是 4 和 9,长度之和是 13,中位数是两个有序数组中的第 7 个元素,因此需要找到第 k=7 个元素。

比较两个有序数组中下标为 k/2−1=2的数,即 A[2] 和 B[2],如下面所示:

在代码中 newIndex1=2 newIndex2=2 index1=0 index2=0

在这里插入图片描述

由于 A[2]>B[2],因此排除 B[0] 到 B[2],即数组 B 的下标偏移(offset)变为 3,同时更新 k 的值:k=k−k/2=4。

在代码中就是 k - = (newIndex1 - index1 + 1) ==k=7-3=4 相当于 中位数减去新地址和老地址的个数 比如 0 1 2 算几个 就是 3-0+1=3个

然后老地址移位 就相当于 下标偏移(offset)变为 3 就是 index2 = newIndex2 + 1==index2=2+1=3 在数组2中的值为4 这个+1的意思是截取3为从第4位算

下一步寻找,比较两个有序数组中下标为 k/2−1=1 的数,即 A[1]和 B[4],如下面所示,其中方括号部分表示已经被除的数。

在代码中我们就得 half = k / 2结果为2; 然后 int newIndex2 = Math.min(index2 + half, length2) - 1;这个相当于就是截取了不算中括号的数组2中值为4的就是1号相当于数组中0号 然后新地址 就是 老地址+之前的half-1 相当于不算 [1 2 3] + half=2的元素还多了一个 所以需要减1 才满足 k/2−1=1的元素即为 即 A[1]和 B[4]

在这里插入图片描述

由于 A[1]<B[4],因此排除 A[0]到 A[1],即数组 A 的下标偏移变为 2,同时更新 k 的值:k=k−k/2。

在代码中就是 pivot1 <= pivot2 比较值 (对应A[1]<B[4]) 然后 k -= (newIndex1 - index1 + 1)对应(同时更新 k); index1 = newIndex1 + 1 (数组 A 的下标偏移变为 2)

下一步寻找,比较两个有序数组中下标为 k/2−1=0 的数,即比较 A[2]和 B[3],如下面所示,其中方括号部分表示已经被排除的数。

在代码中就是如下图 原因前面已经很清楚了

image-20230904230123229

在这里插入图片描述

由于 A[2]=B[3],根据之前的规则,排除 A 中的元素,因此排除 A[2],即数组 A\text{A}A 的下标偏移变为 3,同时更新 k 的值: k=k−k/2=1

在代码中就是

image-20230904230354618

由于 k 的值变成 1,因此比较两个有序数组中的未排除下标范围内的第一个数,其中较小的数即为第 k 个数,由于 A[3]>B[3],因此第 k 个数是 B[3]=4

在代码中就是

image-20230904230439545

在这里插入图片描述

有以下三种情况需要特殊处理:

  • 如果 A[k/2−1]或者 B[k/2−1]越界,那么我们可以选取对应数组中的最后一个元素。在这种情况下,我们必须根据排除数的个数减少 k 的值,而不能直接将 k 减去 k/2。

  • 如果一个数组为空,说明该数组中的所有元素都被排除,我们可以直接返回另一个数组中第 k 小的元素。

  • 如果 k=1,我们只要返回两个数组首元素的最小值即可。

对应代码

解释一下为什么减1是因为k是从1开始算的到数组要-1

image-20230904230916199

到此终于结束了 整个流程分析

建议看玩我这个流程在看官方的详细的流程分析虽然抽象一点 但是理解我的了再看官方的也不是很难 如果想多学一种可以去看官方视频建议理解这个之后在去看视频 和挑战 划分数组解法

4. 寻找两个正序数组的中位数 - 力扣(LeetCode)

总结

这个还是很绕了 可以自己debug一个一个的看然后再加上我上面的思路结合自己的理解加上每个变量的作用理解就可以解决了


		public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
            int length1 = nums1.length, length2 = nums2.length;
            int totalLength = length1 + length2;
            if (totalLength % 2 == 1) {
                int midIndex  = totalLength / 2;
                return getKthElement(nums1, nums2, midIndex + 1);
            } else {
                int midIndex1 = totalLength / 2 - 1, midIndex2 = totalLength / 2;
                return (getKthElement(nums1, nums2, midIndex1 + 1) +
                        getKthElement(nums1, nums2, midIndex2 + 1)) / 2.0;
            }
        }
        public static int getKthElement(int[] nums1, int[] nums2, int k) {

            int length1 = nums1.length, length2 = nums2.length;
            int index1 = 0, index2 = 0;
            while (true) {
                // 边界情况
                if (index1 == length1) {
                    return nums2[index2 + k - 1];
                }
                if (index2 == length2) {
                    return nums1[index1 + k - 1];
                }
                if (k == 1) {
                    return Math.min(nums1[index1], nums2[index2]);
                }

                // 正常情况
                int half = k / 2;
                int newIndex1 = Math.min(index1 + half, length1) - 1;
                int newIndex2 = Math.min(index2 + half, length2) - 1;
                int pivot1 = nums1[newIndex1], pivot2 = nums2[newIndex2];
                if (pivot1 <= pivot2) {
                    k -= (newIndex1 - index1 + 1);
                    index1 = newIndex1 + 1;
                } else {
                    k -= (newIndex2 - index2 + 1);
                    index2 = newIndex2 + 1;
                }
            }
        }

😄总结

在本文中,我们详细分析了查找两个有序数组的中位数问题。我们首先介绍了一种暴力破解的方法,然后深入研究了官方的二分法解决方案。我们解释了每个步骤的原理,并提供了清晰的代码示例。最后,我们强调了该算法的关键思想和特殊情况的处理方法。通过本文,您现在应该能够更自信地处理这个算法问题,并在面试或编程挑战中取得更好的表现。希望这篇文章对您有所帮助,谢谢您的阅读!

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/985727.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外滩大会今日开幕 生成式AI成为热议话题

2023 Inclusion外滩大会9月7日在上海黄浦世博园正式开幕。这场以“科技创造可持续未来”为主题的大会为期三天&#xff0c;近20位“两院”院士、诺贝尔奖和图灵奖得主&#xff0c;全球超500位有影响力的科技领军企业和专家学者&#xff0c;将在此带来一场科技、人文和产业的思想…

第5章 驱动模块传参实验(iTOP-RK3568开发板驱动开发指南 )

经过前两章实验的实战操作&#xff0c;我们已经完成最简单的helloworld驱动实验和模块驱动实验&#xff0c;加载模块可以使用“insmod”函数&#xff0c;使用“insmod”函数进行模块加载时也能进行参数的传递。运用得当可以极大提升内核测试速度。本节就来学习一下如何进行驱动…

Kafka入门与安装

为什么要用消息中间件&#xff1f; 异步处理 场景说明&#xff1a;用户注册后&#xff0c;需要发注册邮件和注册短信。传统的做法有两种1.串行的方式&#xff1b;2.并行方式。 串行方式&#xff1a;将注册信息写入数据库成功后&#xff0c;发送注册邮件&#xff0c;再发送注…

element-ui dialog弹窗 设置点击空白处不关闭

根据官网提供方法 场景&#xff1a;vue实现的网站有两个弹窗同时出现时&#xff0c;关闭报警&#xff0c;批量进度条弹窗也关闭了&#xff0c; 1、每一个页面都有可能出现的报警弹窗&#xff0c; 2、页面a批量操控硬件添加操作的进度条弹窗 开始以为是因为点击报警弹窗&#…

划片机实现装片、对准、切割、清洗到卸片的自动化操作

划片机是一种用于切割和分离材料的设备&#xff0c;通常用于光学和医疗、IC、QFN、DFN、半导体集成电路、GPP/LED氮化镓等芯片分立器件、LED封装、光通讯器件、声表器件、MEMS等行业。划片机可以实现从装片、对准、切割、清洗到卸片的自动化操作。 以下是划片机实现这些操作的步…

CSS 设置渐变背景 CSS 设置渐变边框

一、css渐变背景添加透明度opacity css渐变背景经常会在项目开发中遇到&#xff0c;此时UI如果给出的是单一的渐变背景&#xff08;没有背景透明度&#xff09;&#xff0c;这个我们会很快的写出代码&#xff0c;如下: <div class"btn">这是一个按钮</div&…

datagrip 相关数据连接信息无缝迁移

背景 因为公司换电脑了&#xff0c;接触的项目比较多&#xff0c;不同项目&#xff0c;不同环境的数据库连接有好几十个&#xff0c;如果在新电脑上挨个重新连接一遍劳心劳力&#xff0c;所以想看一下能不能直接将之前保存的连接信息直接迁移到新的电脑上面。 为此&#xff0c…

Apipost压测参数化如何使用

Apipost7.2.1版本一键压测新增参数化功能 如何使用&#xff1f; 这里我们用一个多用户登录情况来演示&#xff0c;需要准备包含用户名密码的CSV文件 创建CSV文件&#xff1a; 新建一个excel表格&#xff0c;在表格中新建username password&#xff0c;在下方输入每个账号和…

利用SoapIU工具生成webservice服务端java代码【二】

整理下今日使用SoapIU工具生成java代码的步骤&#xff0c;以axis2为例. 1.使用SoapUI&#xff0c;new SOAP Project 2.连接成功后&#xff0c;选择project&#xff0c;右键选择“Generate Code”&#xff0c;然后选择“Axis2”

java 整合 swagger-ui 步骤

1.在xml 中添加Swagger 相关依赖 <!-- springfox-swagger2 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!-- springfox-swa…

2023年05月 C/C++(八级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;道路 N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数&#xff1a;道路的长度和需要为该路付的通行费&#xff08;以金币的数目来表示&#xff09; Bob and Alice 过去住在城市 1.在…

阿里云云主机免费试用三个月

试用链接如下&#xff1a; 阿里云云产品免费试用 云主机 费用试用三个月&#xff0c;每月750小时 实例规格 1核(vCPU) 2 GiB S6 系列机型 适用搭建网站等场景 网络带宽 1M 公网固定网络带宽 云盘40 GiB 真香&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

【经验分享】如何使用VSCode对比两个文件

问题&#xff1a; 当有两个不同版本的文件&#xff0c;如何使用VSCode对比两个文件 解决办法 长按ctrl选择想要对比的两个文件-----右键选择将已选项进行比较----大功告成 大功告成

Light Matrix、鲁比尼拳击场和 The Sandbox 联合推出鲁比尼拳击元宇宙

The Sandbox 非常高兴地宣布与 Light Matrix 以及鲁比尼拳击场达成战略合作。作为合作的一部分&#xff0c;The Sandbox、LightMatrix 和鲁比尼拳击场将共同创作「鲁比尼拳击场」&#xff0c;这是第一个在全球范围内展示泰拳艺术和泰拳故事的项目。该项目由 Demo Corporation 开…

算法:数组中的最大差值---“打擂台法“

1、题目&#xff1a; 给定一个整数数组 nums&#xff0c;找出给定数组中两个数字之间的最大差值。要求&#xff0c;第二个数字必须大于第一个数字。 2、分析特点&#xff1a; 求最大差值 > 最大值 - 最小值只需要遍历价格数组一遍&#xff0c;记录历史最小值&#xff0c;非…

DeepStream-gst-dsexample

gst-dsexample是个例子插件&#xff0c;你可以修改定制里的实现。你可以blur原图像&#xff0c;也可以填加新的meta. 变量解释 host_rgb_buf是根据用户设置的宽高processing_width/processing_height,创建的hostcuda内存&#xff0c;需要主要的是&#xff0c;它的格式RGB。 …

接口加密了该怎么测?

对明文编码生成信息摘要&#xff0c;以防止被篡改。比如MD5使用的是Hash算法&#xff0c;无论多长的输入&#xff0c;MD5都会输出长度为128bits的一个串。 摘要算法不要秘钥&#xff0c;客户端和服务端采用相同的摘要算法即可针对同一段明文获取一致的密文。 一、对称加密 对…

孙哥Spring源码第19集

第19集 refresh()-invokeBeanFactoryPostProcessor 三- Import三种形式的处理过程 【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】【微信号&#xff1a;suns45】 1、ImportBeanDefinitionRegister的处理过程 在processImports处理Import注解中 ImportBeanDefinit…

数据结构 - 双向链表

文章目录 目录 文章目录 前言 一、什么是双向链表? 双向链表有什么优势? 二、双向链表的设计和实现 1.设计思想 尾增 : 在链表的末尾添加新的元素 头插 : 在链表头部插入节点 删除 : 根据val的值删除节点 查找 : 根据索引的值查找并返回节点 总结 前言 大家好,今天给…

Window安装虚拟机+给虚拟机安装Linux

一、虚拟机下载 这里使用Virtualbox虚拟机。可以直接从官网下载&#xff1a;Downloads – Oracle VM VirtualBox 点击进行下载&#xff0c;选择window版本的。直接双击&#xff0c;一直下一步 进行安装 PS&#xff1a;安装需要开启CPU虚拟化&#xff0c;一般电脑都已经开启了…