面试算法119:最长连续序列

题目

输入一个无序的整数数组,请计算最长的连续数值序列的长度。例如,输入数组[10,5,9,2,4,3],则最长的连续数值序列是[2,3,4,5],因此输出4。

分析

这个题目是关于整数的连续性的。如果将每个整数看成图中的一个节点,相邻的(数值大小相差1)两个整数有一条边相连,那么这些整数将形成若干子图,每个连续数值序列对应一个子图。计算最长连续序列的长度就转变成求最大子图的大小。
在这里插入图片描述

public class Test {public static void main(String[] args) {int[] nums = {10, 5, 9, 2, 4, 3};int result = longestConsecutive(nums);System.out.println(result);}public static int longestConsecutive(int[] nums) {Set<Integer> set = new HashSet<>();for (int num : nums) {set.add(num);}int longest = 0;while (!set.isEmpty()) {Iterator<Integer> iter = set.iterator();longest = Math.max(longest, bfs(set, iter.next()));}return longest;}private static int bfs(Set<Integer> set, int num) {Queue<Integer> queue = new LinkedList<>();queue.offer(num);set.remove(num);int length = 1;while (!queue.isEmpty()) {int i = queue.poll();int[] neighbors = new int[] {i - 1, i + 1};for (int neighbor : neighbors) {if (set.contains(neighbor)) {queue.offer(neighbor);set.remove(neighbor);length++;}}}return length;}}

分析

用哈希表fathers记录每个整数所在子集的父节点,哈希表counts用来记录以某个整数为根节点的子集中整数的数目。初始化并查集的时候每个整数的父节点都指向自己,也就是每个子集中只包含一个数字,所以哈希表counts的每个整数对应的值都被初始化为1。
接下来对于每个整数num,如果存在num-1和num+1,当它们在不同的子图中时将它们所在的子图用函数union合并,并更新合并后子集中元素的数目。

public class Test {public static void main(String[] args) {int[] nums = {10, 5, 9, 2, 4, 3};int result = longestConsecutive(nums);System.out.println(result);}public static int longestConsecutive(int[] nums) {Map<Integer, Integer> fathers = new HashMap<>();Map<Integer, Integer> counts = new HashMap<>();Set<Integer> all = new HashSet<>();for (int num : nums) {fathers.put(num, num);counts.put(num, 1);all.add(num);}for (int num : nums) {if (all.contains(num + 1)) {union(fathers, counts, num, num + 1);}if (all.contains(num - 1)) {union(fathers, counts, num, num - 1);}}int longest = 0;for (int length : counts.values()) {longest = Math.max(longest, length);}return longest;}private static void union(Map<Integer, Integer> fathers, Map<Integer, Integer> counts, int i, int j) {int fatherOfI = findFather(fathers, i);int fatherOfJ = findFather(fathers, j);if (fatherOfI != fatherOfJ) {fathers.put(fatherOfI, fatherOfJ);int countOfI = counts.get(fatherOfI);int countOfJ = counts.get(fatherOfJ);counts.put(fatherOfJ, countOfI + countOfJ);}}private static int findFather(Map<Integer, Integer> fathers, int i) {if (fathers.get(i) != i) {fathers.put(i, findFather(fathers, fathers.get(i)));}return fathers.get(i);}}

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

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

相关文章

2024年前端面试中JavaScript的30个高频面试题之中级知识

基础知识 高级知识 13. 什么是闭包?闭包的用例有哪些? 闭包是一个功能,它允许函数捕获定义该函数的环境(或保留对作用域中变量的访问)即使在该作用域已经关闭后。 我们可以说闭包是函数和词法环境的组合,其中定义了该函数。 换句话说,闭包为函数提供了访问自己的作用域、…

爬虫利器一览

前言 爬虫&#xff08;英文&#xff1a;spider&#xff09;&#xff0c;可以理解为简单的机器人&#xff0c;如此一个“不为名利而活&#xff0c;只为数据而生&#xff0c;目标单纯&#xff0c;能量充沛&#xff0c;不怕日晒雨淋&#xff0c;不惧寒冬酷暑”的家伙&#xff0c;…

Casper Labs 与 IBM Consulting 合作,AI透明度、审计能力的新方案

​ “全新解决方案&#xff0c;旨在帮助企业更有效地管理训练数据&#xff0c;这些数据由不同的组织通过生成式人工智能系统产生” 企业区块链软件和服务提供商 Casper Labs 与 IBM Consulting 共同宣布&#xff0c;它们将联手推出新的解决方案&#xff0c;以帮助客户在其人工…

Elasticsearch初识之脚本查询附加示例代码(script)

概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能&#xff0c;ES支持多种脚本语言&#xff0c;如painless&#xff0c;其语法类似于Java,也有注释、关键字、类型、变量、函数等&#xff0c;其就要相对于其他脚本高出几倍的性能&…

计算机基础(存储单位)

1. 计算机中的存储单位有哪些 1.1 常见的计算机存储单位 计算机存储单位一般用bit、B、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB……来表示&#xff0c;如下所示&#xff1a; bit位、比特byte&#xff08;B&#xff09;字节、字Kill Byte&#xff08;KB&#xff09;千字…

VSCode 搭建Java开发环境

笔者使用最多的语言是C&#xff0c;也使用过不少其它语言&#xff0c;像Erlang&#xff0c;Python&#xff0c;Lua&#xff0c;C#等等&#xff0c;目前项目中在使用Go&#xff0c;但是没使用过Java。最近看到C#夺冠&#xff0c;首次荣获 TIOBE 年度编程语言&#xff0c;同时也看…

拯救者y9000p安装linux、windows双系统。

首先需要准备启动盘 我用的是Win32DiskImager来做的。资源使用的是ubuntu-20.04.6-desktop-amd64.iso。别用低版本&#xff0c;失败很多次之后的教训。 磁盘管理-磁盘分区-右键-压缩卷 这边分区出来之后&#xff0c;不要分配。安装时候会自动分配的。 重启之后F2进去BIOS设置…

np.polyfit

np.polyfit 是 NumPy 库中用于多项式拟合的函数。这个函数用于拟合一组数据点到一个多项式模型&#xff0c;返回多项式系数。 具体来说&#xff0c;np.polyfit(x, y, deg) 接受三个参数&#xff1a; x: 数据点的 x 坐标。y: 数据点的 y 坐标。deg: 多项式的阶数。 函数返回一…

Vue 中 watch监听器的使用

0. 含义&#xff1a; 在Vue.js中&#xff0c;watch是一个选项&#xff0c;用于监听数据的变化并执行相应的操作。watch提供了一种在数据变化时执行异步或开销较大的操作的机制&#xff0c;以及对一些复杂的数据变化情况做出响应。 1. 简单写法 data: {name: 静静,obj: {hobb…

DEJA_VU3D - Cesium功能集 之 114-雷达效果(基础效果)

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…

使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266)

文章目录 引言一、MQTT理论部分二、使用MQTT.fx接入物联网设备三、使用ESP8266连接阿里云四、参考例程 引言 阿里云物联网平台的接入方式有很多种&#xff0c;从阿里云提供的开发文档可以看到&#xff0c;支持的接入协议有MQTT、HTTPS、CoAP、JT/808、GB/32960协议等等&#x…

算法训练营Day40(动态规划)

今天两题都挺有难度&#xff0c;建议大家思考一下没思路&#xff0c;直接看题解&#xff0c;第一次做&#xff0c;硬想很难想出来。 343. 整数拆分 343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 理解难度大&#xff0c;但学完其实很简单 class Solution {public …

数据库悲观锁 select for update的详解

一 作用 1.1 结论 在mysql中&#xff0c;select ... for update 仅适用于InnoDB&#xff0c;且必须在事务块中才能生效。Innodb引擎默认是行锁。 Select .... from where .... for update 如果在where的查询条件字段使用了【主键|索引】&#xff0c;则此命令上行锁。否…

2024,传统鞋服的“高端梦”该醒了

文 | 螳螂观察 作者 | 图霖 “一千块都不要的波司登&#xff0c;宝贝们还不冲吗&#xff1f;” 入夜&#xff0c;一位身着羽绒服的美女主播在灯火通明的直播间正声嘶力竭地反复呐喊。 一群不知是托还是真实消费者的用户在评论区敲出自己的身高体重&#xff0c;想从主播那得…

【打卡】牛客网:BM81 买卖股票的最好时机(二)

与BM80 买卖股票的最好时机(一)的区别是&#xff0c;可以多次买&#xff0c;但是卖完才能再买。 我的想法是&#xff0c;对于第i天的价格&#xff0c;j从第0天~第i-1天的价格遍历&#xff0c;即&#xff0c;【第j天买入、今天卖出的利润】【第j-1天的利润】&#xff0c;遍历&a…

单链表与循环链表创建

链表 struct List {int data;struct List* next; }创建链表 单链表 实现 struct List* listCreate() {int data;struct List* head NULL;struct List* pre NULL;struct List* current NULL;while(scanf("%d",&data) && data ! -1){current (stru…

【计算机组成原理】IEEE 754 标准定义的浮点数表示格式

IEEE 754 IEEE 754是一种由美国电气和电子工程师协会&#xff08;IEEE&#xff09;制定的标准&#xff0c;用于定义浮点数的表示和运算。这个标准定义了浮点数的格式、舍入规则、特殊值的处理以及算术操作的执行方式。 IEEE 754浮点数标准主要定义了两种浮点数格式&#xff1…

基于LVGL编写的windows串口工具: LCOM

LCOM: Serial Port Tools based on LVGL (PC Software) 一直以来我都想用LVGL做一个真正意义上的PC软件&#xff0c;来验证或者表达LVGL出色的特性&#xff0c;现在我用LCOM做到了&#xff01; LCOM 是一个基于LVGL编写的串口工具&#xff0c;界面简洁&#xff0c;功能出色&a…

Javaweb之SpringBootWeb案例查询部门以及前后端联调的详细解析

2.1 查询部门 2.1.1 原型和需求 查询的部门的信息&#xff1a;部门ID、部门名称、修改时间 通过页面原型以及需求描述&#xff0c;我们可以看到&#xff0c;部门查询&#xff0c;是不需要考虑分页操作的。 2.1.2 接口文档 部门列表查询 基本信息 请求路径&#xff1a;/depts …

235.【2023年华为OD机试真题(C卷)】机器人搬砖(二分查找-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…