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

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

相关推荐
依然鸣8 分钟前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
qeen873 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
lucas_AI3 小时前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
冻柠檬飞冰走茶4 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
民乐团扒谱机4 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
evans在进步5 小时前
LeetCode 394:字符串解码——Java 单栈模拟与嵌套解析详解
java·python·leetcode
Nil2085 小时前
leetcode 189轮转数组
数据结构·算法·leetcode
-dzk-5 小时前
【动态规划】LC 118.杨辉三角
算法·动态规划
恣逍信点5 小时前
《凌微经》静态自悖——变化之自因
人工智能·科技·算法·机器学习·业界资讯·拓扑学·哲学
吃着火锅x唱着歌6 小时前
LeetCode 3885.设计事件管理器
算法·leetcode·职场和发展