哈希-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;
  }

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

相关推荐
夏鹏今天学习了吗23 分钟前
【LeetCode热题100(78/100)】爬楼梯
算法·leetcode·职场和发展
圣保罗的大教堂28 分钟前
leetcode 712. 两个字符串的最小ASCII删除和 中等
leetcode
m0_748250031 小时前
C++ 信号处理
c++·算法·信号处理
Ro Jace1 小时前
电子侦察信号处理流程及常用算法
算法·信号处理
yuyanjingtao2 小时前
动态规划 背包 之 凑钱
c++·算法·青少年编程·动态规划·gesp·csp-j/s
core5123 小时前
SGD 算法详解:蒙眼下山的寻宝者
人工智能·算法·矩阵分解·sgd·目标函数
Ka1Yan3 小时前
[链表] - 代码随想录 707. 设计链表
数据结构·算法·链表
scx201310043 小时前
20260112树状数组总结
数据结构·c++·算法·树状数组
FastMoMO3 小时前
Qwen3-VL-2B 在 RK3576 上的部署实践:RKNN + RKLLM 全流程
算法
光算科技3 小时前
AI重写工具导致‘文本湍流’特征|如何人工消除算法识别标记
大数据·人工智能·算法