首页 > 其他分享 >leetcode 热题思路解析-最长连续序列

leetcode 热题思路解析-最长连续序列

时间:2024-08-20 23:23:14浏览次数:19  
标签:set 数字 nums int res leetcode num 解析 热题

题目

给定一个未排序的整数数组 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

提示:

  • 0 <= nums.length <= 105
  • 109 <= nums[i] <= 109

题解

Problem: 128. 最长连续序列

思路

  1. 首先关注题目中给的用例,发生用例中存在重复的数字,重复的数字的结果的输出是没有影响的,重复的数字会影响我们处理数据的时间,故使用hash表去重。

  2. 怎么找到一串连续的序列?连续的序列的特征是,假设某个数为x,则序列为x+1,x+2,x+3,x+4…,x+y,这个序列一共y + 1个数字,我们可以运用这个特征去找一个数字后面有多少连续的数字,然后再结合set.contains的的特点快速查询某个数字是否存在,一次查找最多查到到n个数字,然后把n个数字作为结果存起来

  3. 那么我们是不是可以循环第2步,找到每次查询的几个连续数字,查询一次就更新一次结果,更新策略为Math.max(res, 当前查询的个数)

  4. 优化:这么做好像已经把问题解决了,但是想一想是否有优化的空间,如果有1,2,3,4,5 这么一串序列,当x为1的时候会去找x+1,x+2,x+3…一共5个数字,这没问题,当x为2的时候继续找x+1,x+2,x+3…一共4个数字,我们发现有很多数字重复查找了,可以通过set.contains(x-1)来判断是否向后查找,如果返回true这表示这个数字以及后面的数字都被查找过了

复杂度

  • 时间复杂度: O(n)
  • 空间复杂度: O(n)
class Solution {
    public int longestConsecutive(int[] nums) {
        if(nums.length == 0) return 0;
        Set<Integer> set =  new HashSet<>();
        for(int num : nums) {
            set.add(num);
        }
        int res = 1;
        for(int num : set) {
            if(set.contains(num-1)){
                continue;
            }
            int tmp = 0;
            while(set.contains(num++)){
                tmp++;
            }
            res = Math.max(res, tmp);
        }
        return res;
    }
}
func longestConsecutive(nums []int) int {
    if len(nums) == 0 {
       return 0 
    }
    var set = make(map[int]int)
    for _, num := range nums {
        set[num] = 0;
    } 
    var res = 1;
    for num, _ := range set {
        if _, ok := set[num-1]; ok {
            continue
        }
        tmp := 0
        flag := true
        for flag {
            if _, ok := set[num]; ok {
                tmp++
                num++
            } else {
                flag = false
            }
        }
        res = int(math.Max(float64(res), float64(tmp)))
    }
    return res
}

如果觉得写的不错的话,点个赞吧

作者:我在网吧学编程
链接:https://leetcode.cn/problems/longest-consecutive-sequence/solutions/2887583/shi-yong-hashbiao-qu-zhong-ran-hou-yi-ci-j06o/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:set,数字,nums,int,res,leetcode,num,解析,热题
From: https://blog.csdn.net/m0_59896206/article/details/141370714

相关文章

  • Windows 隐蔽 DNS 隧道是一种利用 DNS 协议在网络上进行隐蔽数据传输的技术。DNS(域名
    Windows隐蔽DNS隧道是一种利用DNS协议在网络上进行隐蔽数据传输的技术。DNS(域名系统)通常用于将域名解析为IP地址,但其协议本身并不限制传输的数据内容。因此,攻击者或信息安全专家可能利用这一点,通过DNS请求和响应传输未经授权的数据流量。工作原理数据编码:首先,将要传......
  • leetcode面试经典150题- 15. 三数之和
    https://leetcode.cn/problems/3sum/description/?envType=study-plan-v2&envId=top-interview-150 packageleetcode150import("sort""testing")funcTestThreeSum(t*testing.T){nums:=[]int{0,2,2,3,0,1,2,3,-......
  • ViT 原理解析 (Transformers for Image Recognition at Scale)
    ViT原理解析(TransformersforImageRecognitionatScale)原创 小白 小白研究室 2024年06月10日21:09 北京如何将transformer应用到图像领域Transformer模型最开始是用于自然语言处理(NLP)领域的,NLP主要处理的是文本、句子、段落等,即序列数据。视觉领域处理的......
  • leetcode322. 零钱兑换,完全背包最值问题,附背包问题模板
    leetcode322.零钱兑换给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。示例1:输入:coins=[1,2,5......
  • 力扣热题100_二分查找_74_搜索二维矩阵
    文章目录题目链接解题思路解题代码题目链接74.搜索二维矩阵给你一个满足下述两条属性的mxn整数矩阵:每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数target,如果target在矩阵中,返回true;否则,返回fa......
  • Android开发 - BleConnectOptions 类设置蓝牙连接选项解析
    BleConnectOptions是什么BleConnectOptions类是与蓝牙设备连接相关的一个配置类。它主要用于设置蓝牙连接的选项,确保与蓝牙设备的连接能够根据需求进行调整和优化。常用于配置蓝牙设备的连接参数,例如连接超时时间、是否自动连接等。这些配置可以帮助你更好地控制蓝牙连接过程,......
  • OFtutorial10_transportEquation解析
    组成OFtutorial10.C源码头文件#include"fvCFD.H"主函数intmain(intargc,char*argv[]){头文件 //Setupthecase,parsecommandlineoptionsandcreatethegrid#include"setRootCase.H"#include"createTime.H"#inclu......
  • OFtutorial09_runtimePostprocessingUtility解析
    组成pipeCalc.H源码头文件#ifndefpipeCalc_H#definepipeCalc_H#include"volFieldsFwd.H"#include"Switch.H"#include"fvc.H"#include"fvMeshFunctionObject.H"#include"logFiles.H"#include"addToRunTi......
  • 汇编语言的神秘面纱:指令前缀的深度解析
    标题:汇编语言的神秘面纱:指令前缀的深度解析在计算机编程的底层世界中,汇编语言以其接近硬件的特性,扮演着至关重要的角色。指令前缀是汇编语言中一个关键的概念,它为指令提供了额外的信息,使得程序能够执行更加复杂和灵活的操作。本文将深入探讨指令前缀的作用、类型以及如何在......
  • 深入解析CDN(内容分发网络):架构、优势与实现
    摘要内容分发网络(CDN)是一种通过在多个地理位置部署服务器节点来提高网站加载速度和数据传输效率的网络技术。随着互联网内容的日益丰富和用户对访问速度的高要求,CDN已经成为现代网站和应用不可或缺的一部分。本文将详细介绍CDN的基本概念、工作原理、优势以及如何在Web开发......