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

文章目录

  • 最长连续序列
    • 题目描述
    • 示例
      • 示例 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.mzph.cn/news/230027.shtml

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

相关文章

c语言 文件与文件操作

&#x1f3e0; 一.引言 我们日常生活中会将我们制作的ppt,word等存放在文件里进行归类&#xff0c;你是否知道我们能用cC语言对文件进行操作呢(比如文件的打开&#xff0c;关闭和读写等)&#xff1f;那接下来跟博主一起来学习下吧。 &#x1f3e0;二.什么是文件 磁盘上的文件就…

<VR串流线方案> PICO 4 Pro VR串流线方案 Oculus Quest2 Link串流线方案

虚拟现实技术(英文名称&#xff1a;Virtual Reality&#xff0c;缩写为VR)&#xff0c;又称虚拟实境或灵境技术&#xff0c;是20世纪发展起来的一项全新的实用技术。虚拟现实技术囊括计算机、电子信息、仿真技术&#xff0c;其基本实现方式是以计算机技术为主&#xff0c;利用并…

MES系统工单进度查询:提升生产控制与监控

在MES系统中&#xff0c;工单进度查询是一个至关重要的功能&#xff0c;它为企业提供了实时、准确地追踪和监控生产工单进度的能力。 一、MES系统工单进度查询的重要性 1. 实时监控生产进度&#xff1a;通过工单进度查询&#xff0c;企业能够随时了解每个工单的进展情况&#…

qt实现基本文件操作

先通过ui界面实现基本框架 接下来就要实现每个按键的功能了 我们先来实现新建的的功能&#xff0c;我们右键新建键&#xff0c;可以发现没有转到槽的功能&#xff0c;因此我们要自己写connect来建立关系。 private slots:void newActionSlot(); 在.h文件中加上槽函数。 conne…

【ZYNQ学习】PL第一课

这节课讲什么&#xff1f; 这节课的名字本来是想写为LED&#xff0c;但这一课里除了LED也有按键&#xff0c;又想换为GPIO控制&#xff0c;但关于PL的GPIO控制&#xff0c;不应该这么草率和简单&#xff0c;而且这一课有很多和ZYNQ或者PL关联性不强的东西要说。 所以我写了删删…

【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(四)用户管理、部门管理模块

第一篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;一&#xff09;搭建项目 第二篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;二&#xff09;日志输出中间件、校验token中间件、配置路由、基础工具函数。 …

眼镜店验光配镜处方单打印管理系统软件教程

一、前言 1、眼镜店原始的手写处方单逐步被电脑打印单取代 2、使用电脑开单&#xff0c;记录可以保存可以查询&#xff0c;而且同一个人配镜可以对比之前的信息 软件下载或技术支持可以点击最下方官网卡片 如上图&#xff0c;该软件有顾客信息模块&#xff0c;旧镜检查模块…

Acre1-6000电气火灾监控系统在工矿企业的应用——安科瑞 顾烊宇

摘要&#xff1a;主要介绍了电气火灾的主要原因、几种电气火灾监控系统的构成和设立意义。参照各规范&#xff0c;讨论了宜设立电气火灾监控系统的场所。该系统的设立可大大减少电气火灾事故的发生&#xff0c;对保证人们的生命财产安全具有重要意义。 关键词:电气火灾&#x…

极智开发 | macwindows本地部署安装AIGC绘图工具Stable Diffusion WebUI

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 mac&windows本地部署安装AIGC绘图工具Stable Diffusion WebUI。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0ai…

Redis-对象

参考资料 极客时间Redis&#xff08;亚风&#xff09; Redis对象 String • 基本编码⽅式是RAW&#xff0c;基于简单动态字符串&#xff08;SDS&#xff09;实现&#xff0c;存储上限为512mb。 • 如果存储的SDS⻓度⼩于44字节&#xff0c;则会采⽤EMBSTR编码&#xff0c;此…

2023年国家基地“楚慧杯”网络空间安全实践能力竞赛 Wp 一点WP

MISC 参考文章&#xff1a; 天权信安“”2023年国家基地“楚慧杯”网络安全实践能力竞赛初赛WriteUp ez-zip 使用脚本解套娃压缩包 import io import zipfilewith open("4096.zip", "rb") as f:data f.read()info "666"while True:with zi…

AttributeError: module ‘jax‘ has no attribute ‘Array‘解决方案

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

Linux——Ubuntu搭建FTP 时ftp: connect: Connection refused

如何解决ftp: connect: Connection refused&#xff1f; 分析&#xff1a;vsftpd.conf配置文件中默认ipv4:listenNO,ipv6:listen_ipv6YES,默认使用ipv6地址 解决方法&#xff1a;在配置文件中将listenYES开启&#xff0c;并且把listen_ipv6YES注释&#xff0c;重新启动vsftpd…

金蝶云星空和聚水潭单据接口对接

金蝶云星空和聚水潭单据接口对接 接入系统&#xff1a;聚水潭 聚水潭SaaSERP于2014年4月上线&#xff0c;目前累计超过2.5万商家注册使用&#xff0c;成为淘宝应用服务市场ERP类目商家数和商家月订单增速最快的ERP。2014年及2015年“双十一”当天&#xff0c;聚水潭SaaSERP平稳…

初识迭代器(Iterator)——迭代器模式——迭代加深(后续更新...)

学习网页&#xff1a; Welcome to Python.orghttps://www.python.org/ 迭代器&#xff08;Iterator&#xff09; 迭代器是一个非常有用的Python特性&#xff0c;它允许我们遍历一个容器&#xff08;如列表、元组、字典、集合等&#xff09;的元素。迭代器提供了一种方法&…

Vue中的数据变化监控与响应——深入理解Watchers

目录 ​编辑 前言 1. 基本用法&#xff1a; 2. 深度监听&#xff1a; 3. 立即执行&#xff1a; 4. 监听多个数据&#xff1a; 5. 清理监听器&#xff1a; 6. 监听路由变化&#xff1a; 总结&#xff1a; 我的其他博客 前言 在Vue.js中&#xff0c;watch是一种用于监听…

Kafka本地安装⭐️(Windows)并测试生产消息以及消费消息的可用性

2023.12.17 天气晴 温度较低 十点半&#xff0c;不是不想起实在是阳光浴太nice了日常三连&#xff0c;喂&#xff0c;刷&#xff0c;肝刷会儿博客&#xff0c;看会儿设计模式冷冷冷 进被窝 刷视频 睡觉看看kafka的本地部署 》》实践》》成功写会儿博客&#xff0c…

Web前端-HTML(表格与表单)

文章目录 1.表格与表单1.1 概述 2.表格 table2.1 表格概述2.2. 创建表格2.3 表格属性2.4. 表头单元格标签th2.5 表格标题caption&#xff08;了解&#xff09;2.6 合并单元格(难点)2.7 总结表格 3. 表单标签(重点)3.1 概述3.2 form表单3.3 input 控件(重点)type 属性value属性值…

Android 蓝牙BluetoothAdapter 相关(一)

Android 蓝牙相关 本文主要讲述android 蓝牙的简单使用. 1: 是否支持蓝牙 /*** 是否支持蓝牙** return*/ private boolean isSupportBluetooth() {BluetoothAdapter bluetoothAdapter BluetoothAdapter.getDefaultAdapter();return bluetoothAdapter ! null; }2: 开启蓝牙 …

Java之Clonable接口和深浅拷贝

Clonable接口 我们船舰了一个人的对象&#xff0c;想要克隆一个一模一样的对象&#xff0c;可以用到object类里面的克隆方法 object不是所有类的父类吗&#xff1f;那为什么用person1点不出这个方法呢&#xff1f;可以看一下源码 这是Object类里面的clone方法的声明&#xff0…