Leetcode128. 最长连续序列

Leetcode128. 最长连续序列

题目描述

/**
     * 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
     *
     * 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
     *
     */

思路分析

  1. 计算一个数组中连续数字的最长序列长度,可以使用优化思路
  2. 先将数组元素去重,使用Hash结构,具体为Set集合
  3. 然后遍历去重后的数组,对于当前数字,判断集合中是否存在它的前一个数字,即比它小1的数组,如果存在,则连续序列不应该从当前数子开始,应从前边的数字开始,重复其步骤,直到当前数字是当前序列的第一个数
  4. 然后使用内层循环计算以当前第一个数字开始的序列长度
  5. 记录集合中所有的序列长度,然后取最大值返回
  6. 源码见下

源码及分析

 /**
     * @param nums 整数数组
     * @return 返回最长连续长度
     */
    public int longestConsecutive(int[] nums) {
        //使用HASH将数组元素去重
        HashSet<Integer> set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }
        //定义变量保存最大长度
        int longest = 0;
        //遍历去重后的集合中元素
        for (Integer item : set) {
            //加条件确保当前数字是当前序列的第一个数字,如果不是则不进入循环
            if (!set.contains(item - 1)) {
                //记录第一个数字
                int current_num = item;
                // 初始化当前开始序列的长度为1
                int current_length = 1;
                //使用循环判断当前连续序列组成的数字总共有几个并记录大小
                while (set.contains(current_num + 1)) {
                    current_num += 1;
                    current_length += 1;
                }
                //使得longest记录长度最大的序列长度
                longest = Math.max(longest, current_length);
            }
        }
        return longest;
    }
posted @ 2021-09-29 11:50  mx_info  阅读(56)  评论(0编辑  收藏  举报