每日一练 寻找两个正序数组的中间数

news2024/11/19 20:25:46

题目参上,以下是解题思路:

首先,我们应该想到的一种方法是把两数组合并为一个整体的数组,然后返回其中位数即可。那么我们如何合并两数组呢?我们可以用归并排序,设置上下两指针,不断遍历返回较小的那个同时指针后移,这样我们就可以把数组合并,同时我们要注意这样的几种特殊情况:

1.nums1和nums2中有空数组

显然,若其中一个为空,我们直接判断另一个的中位数即可。

2.nums1和nums2的长度不一样

这种怎么办呢?我们只需要设置进入数组的长度即可,即若其中一个已经全部进入数组,那么直接把另一个数组的剩余所有数全进入即可。

那么这个思路能否优化一下呢?

首先,我们要注意,我们只是想要找这两数组的中位数,其实并不需要把整个的数组全都和起来,我们只需要找到数组的中位数所在的位置即可,其次,我们的搜寻方法能否优化呢?显然,二分查找就在这里派上了用场。

下面是解题思路:( 作者:windliang  来源:力扣(LeetCode)) 

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int n1 = nums1.length ;
        int n2 = nums2.length ;
        int left = ( n1 + n2 + 1 ) / 2 ;
        int right = ( n1 + n2 + 2 ) /2 ;
        return (erFen( nums1 , 0 , n1 - 1 , nums2 , 0 , n2 - 1 , left ) + erFen(nums1 , 0 , n1 - 1 , nums2 , 0 , n2 - 1 , right )) * 0.5 ;//注意不能用 /2
    }
    private int erFen(int[] nums1 , int start1 , int end1 , int[] nums2 , int start2 , int end2 , int key){
        int len1 = end1 - start1 + 1 ;
        int len2 = end2 - start2 + 1 ;//注意是实时长度更新
        if( len1 > len2 ){
            return erFen(nums2 , start2 , end2 , nums1 , start1 , end1 , key) ;//保证len1小于len2,这样如果出现空数组则一定为len1
        }
        if( len1 == 0 ){
            return nums2[start2 + key - 1] ;//注意数组是从0开始的
        }
        if( key == 1){
            return Math.min(nums1[start1] , nums2[start2]) ;
        }
        int i = start1 + Math.min(len1 , key / 2 ) - 1 ;
        int j = start2 + Math.min(len2 , key / 2 ) - 1 ;//找到两标记位置i和j
        if(nums1[ i ] > nums2[ j ]){
           return erFen(nums1 , start1 , end1 , nums2 , j + 1 , end2 , key - ( j - start2 + 1)) ;
        }
        else{
           return erFen(nums1 , i + 1 , end1 , nums2 , start2 , end2 , key - ( i - start1 + 1)) ;
        }
    }
}

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

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

相关文章

idea Springboot校园新闻系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 校园新闻发布系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整的源代码和数据库&a…

LeetCode-217存在重复的元素

217 存在重复的元素 给定一个整数数组,判断是否存在重复元素。 如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。 JavaScript的 Array 对象是用于构造数组的全局对象,数组是类似…

如何在iPhone上恢复永久删除的照片?

2007 年,Apple Inc. 推出了这款震撼人心的智能手机,后来被称为 iPhone。您会惊讶地发现,迄今为止,Apple Inc. 已售罄 7 亿台 iPhone 设备。根据 2023 年 8 月的一项调查数据,95% 的智能手机利润都落入了苹果公司的口袋…

【Vue】watch监听复杂数据,新值与旧值一样

问题 watch监听复杂数据,例如数组,旧值与新值一样 解决方案 监听回调里返回新数组,新、旧数组地址改变,得到的值也就不一样,例↓ ()>[...data] 码 test.js // 数据 const musicList ref([{ id: 540000200805…

兑换码生成算法

兑换码生成算法 兑换码生成算法1.兑换码的需求2.算法分析2.重兑校验算法3.防刷校验算法 3.算法实现 兑换码生成算法 兑换码生成通常涉及在特定场景下为用户提供特定产品或服务的权益或礼品,典型的应用场景包括优惠券、礼品卡、会员权益等。 1.兑换码的需求 要求如…

软考--软件设计师(软件工程总结2)

目录 1.测试方法 2.软件项目管理 3.软件容错技术 4.软件复杂性度量 5.结构化分析方法(一种面向数据流的开发方法) 6.数据流图 1.测试方法 软件测试:静态测试(被测程序采用人工检测,计算机辅助静态分析的手段&…

MyBatis 解决上篇的参数绑定问题以及XML方式交互

前言 上文:MyBatis 初识简单操作-CSDN博客 上篇文章我们谈到的Spring中如何使用注解对Mysql进行交互 但是我们发现我们返回出来的数据明显有问题 我们发现后面三个字段的信息明显没有展示出来 下面我们来谈谈解决方案 解决方案 这里的原因本质上是因为mysql中和对象中的字段属性…

构建未来交通:香橙派OPI Airpro上的智能交通监管系统

引言: 随着城市化进程的加速,交通管理变得越来越复杂。 传统的交通监管系统往往无法有效应对日益增长的车辆数量和复杂的交通状况。因此,我们需要一种更加智能和自适应的解决方案来提高交通效率并减少事故发生率。 香橙派OPI Airpro以其强大的…

07 - D触发器

---- 整理自B站UP主 踌躇月光 的视频 1. 电路实现 将 D 接到 S 端,D 取反接到 R 端,两个输入合成一个输入,R 和 S 总是相反的,就构成了 D 触发器。再添加一个EN,作为锁存功能,EN0 时,R 和 S 都…

Mac删除软件,动一动手指,几秒就彻底删除 mac删除软件删不掉的解决方法 mac删除软件后怎么删除软件数据

当你入职新公司,接手前任员工使用的Mac电脑时,很可能会遇到一个非常普遍的问题:电脑中装有大量你不需要的软件。这些软件不仅占用宝贵的硬盘空间,还可能影响电脑的运行速度和效率。为了获得一个干净、清爽的使用体验,删…

Go协程池gopool源码解析

1、gopool简介 Repository:https://github.com/bytedance/gopkg/tree/develop/util/gopool gopool is a high-performance goroutine pool which aims to reuse goroutines and limit the number of goroutines. It is an alternative to the go keyword. gopool的…

【Java基础知识总结 | 第十篇】HashSet底层实现原理

文章目录 10.HashSet底层实现原理10.1HashSet特点10.2HashSet源码10.3 add流程10.4总结 10.HashSet底层实现原理 10.1HashSet特点 存储对象:HashSet 存储对象采用哈希表的方式,它不允许重复元素,即集合中不会包含相同的元素。当向 HashSet …

Linux_进程信号_7

文章目录 1.什么是信号2.信号列表3.信号处理常见方式4.信号的存储5.信号产生前-中-后1.信号产生前2.信号产生中 6产生信号1.signal2.kill3.raise4.abort5.alarm6.硬件异常 7.core dump8.信号产生中1. sigset_t(数据类型)2.信号集操作函数1.sigprocmask2.…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】___续

Vue3中监听多条数据的两种使用 1.watch【使用上一章写法,监听两个属性,然后执行相应操作…】 2.watchEffect【相对于使用watch,watchEffect默认页面初始加载,有点类似加配置:立即执行 immediate】 代码: …

Python:百度AI开放平台——OCR图像文字识别应用

一、注册百度AI开放平台 使用百度AI服务的步骤为: 注册:注册成为百度AI开放平台开发者;创建AI应用:在百度API开放平台上创建相关类型的的AI应用,获得AppID、API Key和Secret Key;调用API:调用…

Word中插入Endnote参考文献时显示乱码

近期在写文章需要插入参考文献,使用Endnote插入时显示乱码,如下图所示: 文章末尾显示{ADDIN EN REFILIST } 解决方法 在网上找了诸多方法尝试也没有解决,最终找到一篇博客介绍了一种方法: word选项—高级&#xff1…

苍穹外卖07(缓存菜品,SpringCache,缓存套餐,添加购物车菜品和套餐多下单,查看购物车,清除购物车,删除购物车中一个商品)

目录 一、缓存菜品 1 问题说明 2 实现思路 3 代码开发:修改DishServiceImpl 4 功能测试 二、SpringCache 1. 介绍 2. 使用语法 1 起步依赖 2 使用要求 3 常用注解 4 SpEL表达式(了解备用) 5 步骤小结 3.入门案例 1 准备环境 2 使用入门 1 引导类上加…

四、MySQL读写分离之MyCAT

一、读写分离概述 1、什么是读写分离: 读写分离:就是将读写操作分发到不同的服务器,读操作分发到对应的服务器 (slave),写操作分发到对应的服务器(master) ① M-S (主从) 架构下&…

【测试篇】测试用例

文章目录 前言具体设计测试用例等价类边界值场景设计法判定表(因果图)正交排列(用的非常少)错误猜测法 前言 什么是测试用例?? 测试用例是针对软件系统或应用程序的特定功能或场景编写的一组步骤&#xf…

记一次Cannot deploy POJO class [xxx$$EnhancerBySpringCGLIB$$xxx]的错误

最近项目上需要使用websocket做服务端&#xff0c;那好说啊&#xff0c;直接springboot集成的websocket 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><versi…