124. 最长连续序列

描述

给定一个未排序的整数数组,找出最长连续序列的长度。

说明

要求你的算法复杂度为O(n)

样例

给出数组[100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4],返回所求长度 4

思路

我们在判断某个数的连续序列时,会分别往减小和增大的方向找下一个连续数在不在数组中。那么我们如何判断我们要寻找的下一个数在不在数组中呢?我们可以先建立一个HashSet,先用HashSet消除数组中的重复元素(相同的两个数只能使连续序列的长度+1),然后查找HashSet中是否包含我们要寻找的下一个元素,包含则长度+1,继续往下寻找,不包含则这个寻找方向就没办法继续了。最后把两个方向的长度加起来即为包含该数的一个连续序列。

代码

public class Solution {
    /**
     * @param nums: A list of integers
     * @return an integer
     */
    public int longestConsecutive(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            set.add(nums[i]);
        }
        
        int longest = 0;
        for (int i = 0; i < nums.length; i++) {
            int down = nums[i] - 1;
            while (set.contains(down)) {
                // 同一序列中的所有元素,不管从哪个开始进行down和up的查找,找到的最终都是同一个序列,为了避免重复运算,要移除set中已经查过的down和up
                set.remove(down);
                down--;
            }
            
            int up = nums[i] + 1;
            while (set.contains(up)) {
                set.remove(up);
                up++;
            }
            
            // 注意上面多执行了一次down--,所以此次要用up - (down + 1)
            longest = Math.max(longest, up - down - 1);
        }
        
        return longest;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,288评论 0 16
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,731评论 0 11
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 西安市位于中国大陆腹地黄河流域中部的关中盆地,秦岭山脉亘于西安以南,是我国北方与南方的重要分界。 20年中国看深圳...
    西岭布衣阅读 108评论 0 0