【LeetCode刷题笔记(3)】【Python】【最长连续序列】【中等】

news2024/9/23 3:16:59

文章目录

  • 最长连续序列
    • 题目描述
    • 示例
      • 示例 1
      • 示例 2
    • 提示
  • 解决方案
    • 解决方案1:【集合去重】+【遍历数组查找元素】
      • 避免无效计数
      • 方案1的可行性分析
    • 解决方案2:【集合去重】+ 【遍历集合查找元素】
      • 运行结果
      • 复杂度分析
  • 结束语

最长连续序列

最长连续序列

题目描述

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

解决方案

不要求序列元素在原数组中连续 ==> 我们可以对原数组【去重】并转换为【新数组】,然后只需要遍历一遍新数组即可查找出数字连续的最长序列。

解决方案1:【集合去重】+【遍历数组查找元素】

代码如下:

class Solution:  
    def longestConsecutive(self, nums: List[int]) -> int:  
        # 将列表转换为集合以去除重复元素,然后再次转换为列表  
        nums = list(set(nums))  
       
          
        # 初始化最长连续序列的长度为0  
        longest_len = 0  
          
        # 遍历新数组
        for n in nums:  
        	# 如果n-1已在数组中,那么当前n一定在遍历n-1时被当作连续的数而计数过,就一定存在longest_num(从n-1开始) = longest_num(从n开始) + 1, 因此这是无效计数
            # 如果n-1不在数组中, 那么这是一次有效计数 
            if n - 1 not in nums:  
                # 初始化当前连续序列的长度为1  
                cur_len = 1  
                # 当n的后一个数在列表中时,继续增加当前连续序列的长度,并更新n的值  
                while n + 1 in nums:  
                    cur_len += 1  
                    n += 1  
                # 如果当前连续序列的长度大于最长连续序列的长度,则更新最长连续序列的长度  
                if cur_len > longest_len:  
                    longest_len = cur_len  
              
        # 返回最长连续序列的长度  
        return longest_len

避免无效计数

理论上,我们可以将数组的每个数(比如n)都作为起点,通过依次查找n+1、n+2…是否存在于数组中来更新数字连续的最大长度。但这样会出现很多无效计数 —> 当已知n存在时,仍然以n+1作为起点,那么longest_num(从n开始) = longest_num(从n+1开始) + 1恒成立 ==>longest_num(从n开始) > longest_num(从n+1开始)恒成立。由于我们仅仅需要统计数字连续的最长序列长度,因此,从n
+1、n+2作为起点的统计都是无效统计。(这个思想在代码中已体现~)

方案1的可行性分析

但根据题意要求,只能设计时间复杂度为 O(n) 的算法。遗憾的是,遍历数组 + 在数组中查找元素的时间复杂度是O(nlogn(遍历+二分查找) or n2(遍历+顺序查找)) > O(n) 。因此,【集合去重】+【遍历数组查找元素】尽管可以解决这个问题,但无法满足时间复杂度的要求。报错如下:
在这里插入图片描述

解决方案2:【集合去重】+ 【遍历集合查找元素】

问题1: 从时间复杂度分析可以看出,问题出在了【遍历数组查找元素】上。首先遍历是无法去掉的 ⇒ 需要将查找元素的时间复杂度降为O(1),那么什么数据结构查找元素的时间复杂度是O(1)?

哈希表!!!

问题2:在Python中,哪些基于哈希表的数据结构适合存储数组元素呢?

集合set!!!更有趣的是,集合把去重的工作也包揽了~

想清楚这两个关键问题,代码也就简单了:

class Solution:  
    def longestConsecutive(self, nums: List[int]) -> int:  
        # 将输入的列表转换为集合,以便快速查找元素  
        nums_set = set(nums)  
          
        # 初始化最长连续序列的长度为0  
        longest_len = 0  
          
        # 遍历集合中的每个元素  
        for n in nums_set:  
            # 如果n的前一个数在集合中,则跳过当前元素  
            if n - 1 in nums_set:  
                continue  
              
            # 初始化当前连续序列的长度为1  
            cur_len = 1  
              
            # 当n的后一个数在集合中时,增加当前连续序列的长度,并更新n的值  
            while n + 1 in nums_set:  
                cur_len += 1  
                n += 1  
              
            # 如果当前连续序列的长度大于最长连续序列的长度,则更新最长连续序列的长度  
            if cur_len > longest_len:  
                longest_len = cur_len  
          
        # 返回最长连续序列的长度  
        return longest_len

运行结果

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(N),其中 N 是数组nums元素的数量。

    • 需要将数组转成集合 ===> O(N)
    • 需要遍历集合,极端情况下集合元素个数和数组nums元素个数相等 ==> O(N)
      • 每次遍历需要查找集合中的元素 ===> O(1)
    • 总时间复杂度 ===> O(N)
  • 空间复杂度:O(N)

    • 创建了一个集合nums_set来存储元素个数为N的数组nums ===> O(N)

结束语

  • 亲爱的读者,感谢您花时间阅读我们的博客。我们非常重视您的反馈和意见,因此在这里鼓励您对我们的博客进行评论。
  • 您的建议和看法对我们来说非常重要,这有助于我们更好地了解您的需求,并提供更高质量的内容和服务。
  • 无论您是喜欢我们的博客还是对其有任何疑问或建议,我们都非常期待您的留言。让我们一起互动,共同进步!谢谢您的支持和参与!
  • 我会坚持不懈地创作,并持续优化博文质量,为您提供更好的阅读体验。
  • 谢谢您的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1315995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2697. 字典序最小回文串

2697. 字典序最小回文串 难度: 简单 来源: 每日一题 2023.12.13 给你一个由 小写英文字母 组成的字符串 s &#xff0c;你可以对其执行一些操作。在一步操作中&#xff0c;你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 &#xff0c;使 s 变…

Enterprise Portal Standard Edition [WS_ENT_STD]

拾取坐标系统 i18n internationalization-CSDN博客 另外一种网站 Content Management System(CMS)-CSDN博客

NAT——网络地址转换

目录 一、概念 二、NAT的分类 1.静态NAT 1.1 静态NAT的配置 1.2 利用eNSP小实验加强对静态NAT的理解 2、动态NAT 三、NAPT——端口映射 四、Easy IP 使用一个公网地址可以让所有人都上公网 一、概念 随着Internet的发展和网络应用的增多&#xff0c;IPv4地址枯竭已经成为…

zabbix批量添加端口监控

背景 以前做监控的时候&#xff0c;一台机器上就几个重要端口&#xff0c;手动添加一下监控就可以了。这次公司一个新业务上了很多服务器&#xff0c;每台服务器上的业务端口很多&#xff0c;而且还不一样。着手动添加会累死人的。所以想zabbix怎么批量添加端口监控。通过查了…

R、python读取空间转录组的8种方式

“ 空间转录组测序主要包括5个步骤&#xff0c;我们着重下游分析部分&#xff1a;空转数据分析和可视化。本篇主分享如何使用python和R读取空转数据&#xff0c;主要使用scanpy stlearn seurat包” 引言 在正式开始之前&#xff0c;我们先看看cellranger流程跑完之后&#xff0…

在Node.js中MongoDB排序的方法

本文主要介绍在Node.js中MongoDB排序的方法。 目录 Node.js中MongoDB排序使用原生的mongodb驱动程序进行排序使用Mongoose库中的排序 Node.js中MongoDB排序 在Node.js中使用MongoDB进行排序&#xff0c;可以使用原生的mongodb驱动程序或者Mongoose库。 使用原生的mongodb驱动…

macbookpro 2024怎么恢复出厂设置

可能你的MacBook曾经是高性能的代表&#xff0c;但是现在它正慢慢地逝去了自己的光芒&#xff1f;随着逐年的使用以及文件的添加和程序的安装&#xff0c;你的MacBook可能会开始变得迟缓卡顿&#xff0c;或者失却了以往的光彩。如果你发现你的Mac开始出现这些严重问题&#xff…

使用Go实现一个百行聊天服务器

前段时间, redis作者不是整了个c语言版本的聊天服务器嘛, 地址, 代码量拢共不过百行. 于是, 心血来潮下, 我也整了个Go语言版本. 简单来说就是实现了一个聊天室的功能. 将所有注释空行都去掉, 刚好100行实现. 废话不多说, 先上代码: package mainimport ("fmt"&quo…

区块链的可扩展性研究【06】Plasma

1.Plasma&#xff1a;Plasma 是一种基于以太坊区块链的 Layer2 扩容方案&#xff0c;它通过建立一个分层结构的区块链网络&#xff0c;将大量的交易放到子链上进行处理&#xff0c;从而提高了以太坊的吞吐量。Plasma 还可以通过智能合约实现跨链交易&#xff0c;使得不同的区块…

机器学习之无监督学习

聚类&#xff1a;发掘纵向结构的某种模式信息&#xff0c;某些x属于相同的分布或者类别 特征学习&#xff1a;发掘横向结构的某种模式信息&#xff0c;每一行都可以看成是一种属性或特征 密度估计&#xff1a;发掘底层数据分布&#xff0c;x都是从某个未知分布p(x)采出来的&a…

39、平均池化和全局平均池化

在了解了池化算法的基本概念之后,继续了解一个应用很广泛的池化,叫作全局平均池化。 先看下平均池化。平均池化就是在池化核标定的范围内,对像素取平均值然后作为输出。在很多AI框架或算法描述中,平均池化大概可以分为两种:一种叫作adaptive average pool(自适应平均池化…

Facebook广告系统结构

Facebook广告系统是一个复杂的大型系统&#xff0c;由多个组件和子系统相互配合工作&#xff0c;实现了广告的投放、拍卖、个性化推荐和效果评估等功能。下面小编讲讲Facebook广告系统的结构。 1、广告管理界面 广告管理界面是广告主与Facebook进行交互的入口&#xff0c;广告…

@PostMapping接收String类型的参数

接口这样定义&#xff1a; PostMapping("/aaa") public void getById(String param)参数这样测试&#xff1a;

腾讯云优惠全站搜——云服务器配置大全精准

腾讯云推出优惠全站搜页面 https://curl.qcloud.com/PPrF9NFe 在这个页面可以一键查询所需云服务器、轻量应用服务器、数据库、存储、CDN、网络、安全、大数据等云产品优惠活动大全&#xff0c;活动打开如下图&#xff1a; 腾讯云优惠全站搜——优惠合集 如上图&#xff0c;在这…

Linux下FFmepg使用

1.命令行录一段wav,PCM数据 ffmpeg -f alsa -i hw:0,0 xxx.wav//录制 ffplay out.wav//播放ffmpeg -f alsa -i hw:0,0 -ar 16000 -channels 1 -f s16le 1.pcm ffplay -ar 16000 -channels 1 -f s16le 1.pcm -ar freq 设置音频采样率 -ac channels 设置通道 缺省为1 2.将pcm…

10天玩转Python第7天:python 面向对象 全面详解与代码示例

今日内容 封装(定义类的过程) 案例(存放家具) 继承 多态 封装的补充 私有和公有权限属性的分类(实例属性, 类属性)方法的分类(实例方法, 类方法, 静态方法) 封装案例 # 定义家具类 class HouseItem: """家具类""" def __init__(self, name, a…

LT7911D是TYPE-C/DP或者EDP转2 PORT MIPI和LVDS加音频

1.概述&#xff1a; T7911D是一款高性能TYPE-C/DP/EDP转2 PORT MIPI或者LVDS的芯片&#xff0c;目前主要在AR/VR或者显示器上应用的很多&#xff0c;对于DP1.2输入&#xff0c;LT7911D可配置为1/2/4车道。自适应均衡化使其适用于长电缆应用&#xff0c;最大带宽可达21.6Gbps。…

Vue3报错: ‘defineProps‘ is not defined,解决方法

问题出现: 今天在使用 <script setup>组合式 API 的语法糖的时候&#xff0c;定义defineProps时候报错&#xff1a; ‘defineProps’ is not defined 查了一下资料&#xff0c;这是因为eslint的语法校验导致的问题。 解决方法1&#xff1a; 在项目根目录的文件.eslin…

时序预测 | Python实现XGBoost电力需求预测

时序预测 | Python实现XGBoost电力需求预测 目录 时序预测 | Python实现XGBoost电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前最先进的行业预测进行比较…

JS中的String常用的实例方法

splice():分隔符 把字符串以分隔符的形式拆分为数组 const str pink,red;const arr str.split(,);console.log(arr);//Array[0,"pink";1:"red"]const str1 2022-4-8;const arr1 str1.split(-);console.log(arr1);//Array[0,"2022";1:"…