面试算法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.hqwc.cn/news/343019.html

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

相关文章

开源知识库工具大盘点,赶紧收藏

有一个顶尖的知识库是任何一家企业的核心竞争力。它不仅可以帮助新员工更快地熟悉工作&#xff0c;也可以节省资深团队成员的时间来解决重复问题。但是&#xff0c;如何找到一个适合你的知识库工具呢&#xff1f;别担心&#xff0c;本文就给你推荐5款顶尖的开源知识库工具&…

Exception in thread “main“ java.lang.ArrayIndexOutOfBoundsException(数组创建问题)

数组在Java中使用还是比较多的&#xff0c;通过索引去数组中寻值&#xff0c;也可以通过数组索引去赋值 问题描述&#xff1a; 我们在直接使用未被new的数组时就会出现这种情况&#xff0c; 这边简单创建一个运行类 public class a {public static void main(String[] args)…

5G前装搭载率即将迈过10%大关,车载通讯进入多层次增长通道

对于智能化来说&#xff0c;车载通讯性能的提升&#xff0c;对于相关功能的用户体验优化、进一步减少通讯时延以及打开应用新空间&#xff0c;至关重要。 目前&#xff0c;2G/3G正在进入运营商逐步关闭运营的阶段&#xff0c;4G依然是主力&#xff0c;但5G也在迎来新的增长机会…

强化学习应用(一):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

RflySim | 定点位置控制器设计实验二

基础实验 1.复现四旋翼Simulink仿真&#xff0c;分析控制作用在obxb轴和obyb轴的解耦。 2.对系统进行扫频以绘制Bode图&#xff0c;分析闭环位置控制系统稳定裕度。 3.完成硬件在环仿真。 本实验对应demo文件对于RflySim v3.0以下版本地址为&#xff1a;*\PX4PSP\RflySimAP…

【LeetCode每日一题】2085. 统计出现过一次的公共字符串(哈希表)

2024-1-12 文章目录 [2085. 统计出现过一次的公共字符串](https://leetcode.cn/problems/count-common-words-with-one-occurrence/)思路&#xff1a;哈希表计算 2085. 统计出现过一次的公共字符串 思路&#xff1a;哈希表计算 1.用两个哈希表分别统计word1和word2中字符出现的…

gcc/g++工具详解

目录 一、安装gcc/g 二、背景知识 三、相关选项 四、gcc如何工作 1.预处理 2.编译 3.汇编 4.链接 5.函数库的概念 6.动静态库 一、安装gcc/g gcc/g -v : 用来查看当前你使用的gcc/g版本 因为我的gcc/g是升级过的所以版本更高&#xff0c;如果你用的是centos7.6的话…

PyCharm连接服务器(利用PyCharm实现远程开发)

利用PyCharm实现远程开发 注&#xff1a;该功能只有在PyCharm专业版下才可以使用&#xff0c;并且必须是官方的正版许可&#xff0c;破解版的是不可以使用的&#xff01;&#xff01;&#xff01;可以通过免费教育许可申请使用权限&#xff08;申请流程&#xff09;。 pycharm…

使用C语言调用 liblapack.a 的使用方法及其原理探析

1&#xff0c; 使用方法 1.1 源代码 #include <stdio.h> //#include <lapack/lapacke.h> extern void dgesv_(int*m, int* n, double*A, int*k, int*IP, double*B, int*j, int*info);#define M 2 #define N 2int main() {int i, j, nN, mM;int info, IPIV[N];doub…

x-cmd pkg | busybox - 嵌入式 Linux 的瑞士军刀

目录 简介首次用户功能特点竞品和相关作品 进一步阅读 简介 busybox 是一个开源的轻量级工具集合&#xff0c;集成了一批最常用 Unix 工具命令&#xff0c;只需要几 MB 大小就能覆盖绝大多数用户在 Linux 的使用&#xff0c;能在多款 POSIX 环境的操作系统&#xff08;如 Linu…

大数据实时抓取软件:Maxwell学习网站的高效框架!

介绍&#xff1a;Maxwell是由美国Zendesk开源的&#xff0c;使用Java编写的MySQL实时抓取软件。它能够实时读取MySQL的二进制日志&#xff08;Binlog&#xff09;&#xff0c;并将这些信息生成为JSON格式的消息。进一步地&#xff0c;Maxwell将这些消息作为生产者发送给Kafka、…

腾讯云COS桶文件上传下载工具类

1&#xff0c;申请key和密钥 2&#xff0c;引入依赖 <dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.24</version></dependency>3&#xff0c;工具类 package com.example.activi…