java算法day29

java算法day29

  • 128 最长连续序列

128 最长连续序列

这个题审好题是关键。

这个题问的最长连续序列指的是数字依次递增的序列的最长长度。

比如例子[100,4,200,1,3,2]

那么就是1,2,3,4。长度为4

0,3,7,2,5,8,4,6,0,1

那么就是0,1,2,3,4,5,6,7,8长度为9

接下来来看做法:

这个题最好想的应该是哈希。最直观的想法应该就是为了统计每个连续序列的长度,那么我们希望定位到每个连续序列的起点。然后从起点开始遍历每个序列,从而获取长度,更新最长长度。

问题关键:什么样的数才是一个连续序列的起点?

回答是这个数的前一个数不存在于数组中。因此我们需要能够快速判断当前num的前num-1是否存在于数组中。那么快速判断我们就可以用哈希来优化。如果num-1还在数组中,那说明这个num肯定不是序列的起点,如果不在数组中,那么就能肯定,是序列的起点。至于为什么,自己想想就清楚了。

那么定位到了起点之后,就要从起点开始遍历整个序列,直到当前数的num+1并不存在于数组中时,可以判断遍历终止,因此还需要能够快速判断num后面的num+1是否存在于数组中。

可以看到这个过程涉及了很多快速查找的使用,因此哈希表用来存储数组中的所有数已经非常明确了。

java 复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        int res = 0;    // 记录最长连续序列的长度
        Set<Integer> numSet = new HashSet<>();  // 记录所有的数值
        for(int num: nums){
            numSet.add(num);    // 将数组中的值加入哈希表中
        }
        int seqLen = 0;     // 连续序列的长度
        for(int num: numSet){
            // 如果当前的数是一个连续序列的起点,统计这个连续序列的长度
            if(!numSet.contains(num - 1)){
                seqLen = 1;
                while(numSet.contains(++num))seqLen++;  // 不断查找连续序列,直到num的下一个数不存在于数组中
                res = Math.max(res, seqLen);    // 更新最长连续序列长度
            }
        }
        return res;
    }
}
相关推荐
探索java2 分钟前
Java 深入解析:JVM对象创建与内存机制全景图
java·jvm
Sylvia-girl9 分钟前
Java---IDEA
java·开发语言·intellij-idea
Z_W_H_15 分钟前
【Springboot】Bean解释
java·开发语言
Otaku love travel1 小时前
老系统改造增加初始化,自动化数据源配置(tomcat+jsp+springmvc)
java·tomcat·初始化·动态数据源
DKPT1 小时前
Java设计模式之行为型模式(责任链模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
L_autinue_Star2 小时前
手写vector容器:C++模板实战指南(从0到1掌握泛型编程)
java·c语言·开发语言·c++·学习·stl
我爱C编程2 小时前
基于Qlearning强化学习的1DoF机械臂运动控制系统matlab仿真
算法
晨岳2 小时前
CentOS 安装 JDK+ NGINX+ Tomcat + Redis + MySQL搭建项目环境
java·redis·mysql·nginx·centos·tomcat
chao_7892 小时前
CSS表达式——下篇【selenium】
css·python·selenium·算法
执笔诉情殇〆2 小时前
前后端分离(java) 和 Nginx在服务器上的完整部署方案(redis、minio)
java·服务器·redis·nginx·minio