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

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

相关推荐
灵感__idea3 小时前
Hello 算法:贪心的世界
前端·javascript·算法
澈2074 小时前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
ambition202424 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_4 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
qiqsevenqiqiqiqi4 小时前
前缀和差分
算法·图论
代码旅人ing5 小时前
链表算法刷题指南
数据结构·算法·链表
Yungoal5 小时前
常见 时间复杂度计算
c++·算法
6Hzlia5 小时前
【Hot 100 刷题计划】 LeetCode 48. 旋转图像 | C++ 矩阵变换题解
c++·leetcode·矩阵
不爱吃炸鸡柳6 小时前
单链表专题(完整代码版)
数据结构·算法·链表
CylMK6 小时前
题解:AT_abc382_d [ABC382D] Keep Distance
算法