首页 > 编程语言 >每日算法之最长连续序列

每日算法之最长连续序列

时间:2024-03-28 18:33:38浏览次数:23  
标签:tmp cur nums 算法 length num dict 序列 最长

题目描述

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

解题思路

暴力解法

1、以最快的效率先排序。
2再遍历一趟序列得到结果,时间复杂度主要取决于排序的快慢,好的情况下是O(n),坏的情况下是O(n^2)。

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        l = len(nums)
        if l < 2:
            return l
        nums.sort()
        print(nums)
        result = 0
        tmp = 1
        for i in range(l-1):
            j = nums[i+1] - nums[i]
            print(nums[i+1],nums[i],tmp)
            if j == 1:
                tmp += 1
            elif j == 0:
                continue
            elif tmp > 1:
                if tmp >= result:
                    result = tmp
                tmp = 1
        
        return max(tmp,result)

总体上解题思路有些固定。当然,通过set的方式可以简化代码,但是没酱紫快

哈希解法

1、用哈希表存储每个端点值对应连续区间的长度
2、若数已在哈希表中:跳过不做处理
3、若是新数加入:
取出其左右相邻数已有的连续区间长度 left 和 right
计算当前数的区间长度为:cur_length = left + right + 1
根据 cur_length 更新最大长度 max_length 的值
更新区间两端点的长度值

class Solution(object):
    def longestConsecutive(self, nums):
        hash_dict = dict()
        
        max_length = 0
        for num in nums:
            if num not in hash_dict:
                left = hash_dict.get(num - 1, 0)
                right = hash_dict.get(num + 1, 0)
                
                cur_length = 1 + left + right
                if cur_length > max_length:
                    max_length = cur_length
                
                hash_dict[num] = cur_length
                hash_dict[num - left] = cur_length
                hash_dict[num + right] = cur_length
                
        return max_length

标签:tmp,cur,nums,算法,length,num,dict,序列,最长
From: https://blog.csdn.net/qq_42691309/article/details/137087209

相关文章

  • (53/60)最长公共子序列、不相交的线、最大子序和
    最长公共子序列leetcode:1143.最长公共子序列动态规划思路和最长重复子序列很像,但是这个不要求连续。意义略有不同,因此result不需要找最大值,直接就是最末的dp元素。代码实现classSolution{public:intlongestCommonSubsequence(stringtext1,stringtext2){......
  • (57/60)回文子串、最长回文子序列
    DP最后一集回文子串leetcode:647.回文子串动态规划代码实现classSolution{public:/*s[i:j]回文子串个数为dp[i][j]if(s[i]==s[j]){if(j-i<=1)dp[i][j]=true;elsedp[i][j]=dp[i+1][j-1];}全部初始化为0*/intcountSubstrings(strings)......
  • 补|(52/60)最长递增子序列、最长连续递增序列、最长重复子数组
    子序列问题最长递增子序列leetcode:300.最长递增子序列动态规划代码实现/*以nums[i]结尾的(含)递增子序列最长为dp[i]dp[i]由dp[0~i-1]的最大值推出if(nums[i]>nums[j])dp[i]=max(dp[i],dp[j]+1);//如果严格递增dp[0]=1;其余为0正序遍历*/classSol......
  • 虚拟游戏理财 算法题
    华为ODC卷 虚拟游戏理财暴力枚举法。更好的方法是动态规划。菜鸡不会。自己也写了,但是不全对,gpt写的,但是也有问题。自己修改后正确:importjava.util.*;publicclassInvestmentGame{publicstaticvoidmain(String[]args){Scannerscanner......
  • 洛谷题单指南-图的基本应用-P1807 最长路
    原题链接:https://www.luogu.com.cn/problem/P1807题意解读:由于对于每一条边u->v,都有u<v,因此节点1的入度一定是0,且是有向无环图,直观上可以通过拓扑排序法搜索每一个节点,计算1到每一个节点的最长距离。但问题在于,入度为0的节点可能不止一个,这样在计算到某个点的最长距离时,会受到......
  • Fastjson反序列化分析
    依赖先研究1.2.24版本的,版本高了就有waf了,不过也能绕,高版本以后再说<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.24</version></dependency><dependency><groupId&g......
  • 「NOI2009」变换序列
    二分图最大匹配#贪心如果没有字典序最小的限制,直接二分图最大匹配就可以了考虑怎么让字典序最小倒序匹配左侧节点,对于每个节点,优先尝试字典序较小的方案,用hungary就行另,如果用费用流,需要将斐波那契的第\(10^4\)位作为费用//Author:xiaruize#ifndefONLINE_JUDGEbool......
  • 知识图谱推理算法综述(下):基于语义的匹配模型
    背景知识图谱系统的建设需要工程和算法的紧密配合,在工程层面,去年蚂蚁集团联合OpenKG开放知识图谱社区,共同发布了工业级知识图谱语义标准OpenSPG并开源;算法层面,蚂蚁从知识融合,知识推理,图谱应用等维度不断推进。OpenSPGGitHub,欢迎大家Star关注~:https://github.com/Ope......
  • 【算法】归并排序(递归法)
    目录归并排序简介算法步骤(递归)C语言实现归并排序简介归并排序(mergesort)是一种高效、通用且基于比较的排序算法。由约翰·冯·诺依曼(JohnvonNeumann)于1945年发明,是一种分治算法(divide-and-conqueralgorithm)。时间复杂度为O(nlog⁡n)O{\left(n\log......
  • 08天【代码随想录算法训练营34期】第四章 字符串part02(KMP)
    KMP算法解决字符串匹配问题文本串aabaabaaf模式串aabaaf问:模式串是否在文本串中出现过?1)暴力解法,ptr指向文本串index0,遍历一遍发现不匹配,ptr再移向index1,遍历……依次重复,直到ptr指向32)KMP算法,ptr指向文本串index0,遍历到f发现不匹配,由于“aa”在字符串中index3和4时也出现......