哈希-02-最长连续序列

文章目录

  • [1. 题目描述](#1. 题目描述)
  • [2. 思路](#2. 思路)
  • [3. 代码](#3. 代码)

1. 题目描述

给定一个未排序的整数数组nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2]

输出:4

解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]

输出:9

示例 3:

输入:nums = [1,0,1,2]

输出:3

提示:

  • 0 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9

2. 思路

  • 不考虑时间复杂度解法:
    • 对数组排序,按照指针法持续比较相邻两位数字的大小,是否满足nums[j-1] + 1 == nums[j]
    • 考虑数组长度为0和1的边界情况。
  • O(n)解法:
    • 结合示例3和题干要求------不要求序列元素在原数组中连续,那么只要存在连续的数字就可以了,可以对数组去重(结合set的特性)。
    • 找到连续序列的起点(判断set中是否有比当前数字更小的),如果没有可以确定是起点。
    • 后续持续判断是否存在比当前数字大1的,有就更新长度。

3. 代码

  • 不考虑时间复杂度:
java 复制代码
public int longestConsecutive(int[] nums) {
    ArrayList<Integer> lens = new ArrayList<>();
    Arrays.sort(nums);

    if (nums.length == 1) {
      return 1;
    }

    for (int i = 0; i < nums.length; i++) {
      int count = 1;
      for (int j = i+1; j < nums.length; j++) {
        if (nums[j-1] + 1 == nums[j]) {
          count ++;
        } else if (nums[j] == nums[j-1]) {
          if (j == nums.length-1) {
            lens.add(count);
          }
          continue;
        } else {
          lens.add(count);
          break;
        }
        if (j == nums.length-1) {
          lens.add(count);
        }
      }
    }
    Collections.sort(lens);


    return lens.isEmpty() ? 0:lens.get(lens.size()-1);
  }
  • O(n)解法:
java 复制代码
public int longestConsecutive2(int[] nums) {
    if (nums == null || nums.length == 0) {
      return 0;
    }
    Set<Integer> numSet = new HashSet<>();
    for (int num : nums) {
      numSet.add(num);
    }

    int len = 0;
    for (Integer num : numSet) {
      if (!numSet.contains(num-1)) {
        //可以确定为起点
        int currentNum = num;
        int currentLen = 1;
        while (numSet.contains(currentNum + 1)) {
          currentLen ++;
          currentNum ++;
        }
        len =  Math.max(len, currentLen);
      }
    }
    return len;
  }

以上为个人学习分享,如有问题,欢迎指出:)

相关推荐
yugi9878382 小时前
基于MATLAB实现协同过滤电影推荐系统
算法·matlab
Morwit2 小时前
【力扣hot100】64. 最小路径和
c++·算法·leetcode
leoufung2 小时前
LeetCode 373. Find K Pairs with Smallest Sums:从暴力到堆优化的完整思路与踩坑
java·算法·leetcode
wifi chicken3 小时前
数组遍历求值,行遍历和列遍历谁更快
c语言·数据结构·算法
胡楚昊3 小时前
NSSCTF动调题包通关
开发语言·javascript·算法
Gold_Dino3 小时前
agc011_e 题解
算法
bubiyoushang8884 小时前
基于蚁群算法的直流电机PID参数整定 MATLAB 实现
数据结构·算法·matlab
风筝在晴天搁浅4 小时前
hot100 240.搜索二维矩阵Ⅱ
算法·矩阵
girl-07264 小时前
2025.12.24代码分析
算法