Python面试宝典第11题:最长连续序列

题目

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

排序法

        排序法在最坏情况下的时间复杂度为O(nlogn),不满足本题时间复杂度为O(n)的要求。但它提供了一个不同的解题视角,还是值得我们学习一下的。使用排序法求解本题的主要步骤如下。

        1、首先,将输入数组nums进行排序。这一步的目的是使得连续的数字相邻,便于后续遍历查找连续序列。

        2、对排序后的数组进行遍历,并初始化两个变量。其中,current_streak用于记录当前连续序列的长度,longest_streak用于记录遇到的最长连续序列的长度。

        3、在遍历过程中,比较当前元素与前一个元素的关系。如果当前元素正好比前一个元素大1,则说明它们属于同一个连续序列,此时current_streak加1。否则,说明遇到了新的序列起点,此时更新longest_streak(如果current_streak大于longest_streak),并将current_streak重置为1。

        注意:需要对数组中存在相同元素的情况进行额外处理,以避免重复元素导致的误判。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def get_longest_consecutive_by_sort(nums):if not nums:return 0nums.sort()longest_streak = 1current_streak = 1for i in range(1, len(nums)):# 避免重复元素导致的误判if nums[i] != nums[i-1]:if nums[i] == nums[i-1] + 1:current_streak += 1else:longest_streak = max(longest_streak, current_streak)current_streak = 1return max(longest_streak, current_streak)print(get_longest_consecutive_by_sort([100, 4, 200, 1, 3, 2]))
print(get_longest_consecutive_by_sort([0, 3, 7, 2, 5, 8, 4, 6, 0, 1]))

哈希法

        使用哈希法的基本思想如下:首先,将所有数组中的元素添加到哈希集合中,以便快速查询一个数字是否已存在。然后,遍历数组中的每个元素,对于每个元素,检查它是否是某个连续序列的起始点(即检查num - 1不在哈希集合中)。如果是起始点,则尝试向后扩展序列,同时更新最长序列长度。为了避免重复计算,每当我们确定了一个数字属于某个连续序列时,就将其从哈希集合中移除。使用哈希法求解本题的主要步骤如下。

        1、初始化。创建一个空的哈希集合num_set,用来存储数组中的所有数字。

        2、填充哈希集合。遍历数组nums,将所有元素添加到哈希集合num_set中。

        3、遍历并检查连续性。再次遍历数组nums,对于每个元素,检查它是否能作为连续序列的起点,即检查 num - 1 是否不在 num_set 中。

        4、扩展序列并更新长度。如果找到了一个起点,就尝试通过不断检查 num + 1 是否在 num_set 中来扩展序列,并相应地更新最长序列长度。

        5、移除已访问元素。在扩展序列的过程中,将访问过的数字从 num_set 中移除,以避免之后的重复计算。

        6、返回找到的最长连续序列的长度。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def get_longest_consecutive_by_hash(nums):if not nums:return 0num_set = set(nums)longest_streak = 0for num in num_set:if num - 1 not in num_set:current_num = numcurrent_streak = 1while current_num + 1 in num_set:current_num += 1current_streak += 1longest_streak = max(longest_streak, current_streak)return longest_streakprint(get_longest_consecutive_by_hash([100, 4, 200, 1, 3, 2]))
print(get_longest_consecutive_by_hash([0, 3, 7, 2, 5, 8, 4, 6, 0, 1]))

总结

        使用哈希法求解本题时,每个元素仅被访问两次:一次加入哈希集合,另一次作为序列起点检查。遍历和序列扩展操作均在常数时间内完成,故总的时间复杂度为O(n),满足本题的要求。另外,哈希法需要额外的空间来存储哈希集合。最坏情况下,数组中的所有元素都是唯一的,因此哈希集合将存储n个元素,空间复杂度为O(n)。

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

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

相关文章

STM32智能电网监控系统教程

目录 引言环境准备智能电网监控系统基础代码实现:实现智能电网监控系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:电网监控与优化问题解决方案与优化收尾与总结 1. 引言 智能电网监控系统通过S…

学习网络的第一步:全面解析OSI与TCP/IP模型

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是你们的好朋友小米。今天我们来聊一聊网络基础知识中的重量级选手——OSI模型和TCP/IP模型!网络的世界就像一个巨大的迷宫,而这两个…

肯尼亚PVoC认证

一、肯尼亚PVoC认证介绍 为了向肯尼亚消费者保证,他们购买的进口商品的安全和质量,并保护肯尼亚制造商免受不公平竞争,肯尼亚标准局(KEBS)是肯尼亚政府的一个法定机构,实施了“出口肯尼亚出口验证&#xff…

【源码开源】C#桌面应用开发:串口调试助手

c#桌面应用开发 1、环境搭建和工程创建:参照番茄定时器项目 工程创建参照 2、界面布局设计 3、具体功能函数 (1)端口扫描: private void btn_com_scan_Click(object sender, EventArgs e){//端口号扫描ReflashPortToComboBox(…

赤壁之战的烽火台 - 观察者模式

“当烽火连三月,家书抵万金;设计模式得其法,千军如一心。” 在波澜壮阔的三国历史长河中,赤壁之战无疑是一场改变乾坤的重要战役。而在这场战役中,一个看似简单却至关重要的系统发挥了巨大作用——烽火台。这个古老的…

基于ssm的图书管理系统的设计与实现

摘 要 在当今信息技术日新月异的时代背景下,图书管理领域正经历着深刻的变革,传统的管理模式已难以适应现代社会的快节奏和高要求,逐渐向数字化、智能化的方向演进。本论文聚焦于这一转变趋势,致力于设计并成功实现一个基于 SSM&…

在HTTP协议中常见的Token类型

在HTTP协议中&#xff0c;常见的Token类型主要有以下几种&#xff1a; Bearer Token&#xff1a;最常见的类型&#xff0c;用于OAuth 2.0认证&#xff0c;通过Authorization头传递&#xff0c;格式为Bearer <token>。更多请阅读&#xff1a;JWK和JWT 学习-CSDN博客 Basi…

【数据结构】09.树与二叉树

一、树的概念与结构 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 根结点&#xff1a;根…

应变与几何方程——弹性力学

变形协调方程 正应变的表达式&#xff1a;切应变的表达&#xff1a; 考虑坐标位移移动造成的增量 应变——考虑物体的变形的剧烈程度 正应变——微元线段长度的变化 剪应变——两微元所夹角度的变化 正应变——拉伸为正&#xff0c;压缩为负 剪应变——夹角减小为正&#x…

删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 快慢指针&#xff0c;慢的指针去追赶快的指针&#xff0c;相等时也就是追到时&#xff0c;快指针移动向前 class Solution { public:int removeDuplicates(vector<int>& nums) {int s 1, q 1;i…

sql盲注

文章目录 布尔盲注时间盲注 布尔盲注 介绍&#xff1a;在网页只给你两种回显的时候是用&#xff0c;类似于布尔类型的数据&#xff0c;1表示正确&#xff0c;0表示错误。 特点&#xff1a;思路简单&#xff0c;步骤繁琐且麻烦。 核心函数&#xff1a; length()函数substr()函…

物流智能锁在物流货运智能锁控管理中的应用

一、物流锁控管理的痛点剖析 &#xff08;一&#xff09;货物安全风险高 在传统的物流运输中&#xff0c;常用的机械锁和普通电子锁安全性有限&#xff0c;容易被非法破解或撬开。据不完全统计&#xff0c;每年因货物被盗造成的经济损失高达数十亿。这导致货物在运输途中面临…

前端Canvas入门——怎么用Canvas画一些简单的图案

Canvas作为前端的画图工具&#xff0c;其实用途还是蛮广泛的&#xff0c;但是很多前端学习课程其实都很少涉及到这块内容。 于是乎&#xff0c;就写下这个了。 当然啦&#xff0c;目前还在学习摸索中。 一些实战代码&#xff0c;仅供参考&#xff1a; <canvasid"ctx&…

旅游景区度假村展示型网站如何建设渠道品牌

景区、度假村、境外旅游几乎每天的人流量都非常高&#xff0c;还包括本地附近游等&#xff0c;对景区及度假村等固定高流量场所&#xff0c;品牌和客户赋能都是需要完善的&#xff0c;尤其是信息展示方面&#xff0c;旅游客户了解前往及查看信息等。 通过雨科平台建设景区度假…

C++系列-Vector(一)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” Vector的介绍及使用 Vector的介绍 当vector构建的参数类型为char类型时&#xff0c;它是和string是极其类似的&#xff0c;但是二者之间也有不同&#xff0c;比如&#xff0c…

旋转矩阵中的易错点

坐标系O1和O2&#xff0c;假设点P在坐标系O1中的坐标是{A1,B1,C1},坐标系O1先沿着y轴旋转-90度&#xff0c;再沿着Z轴旋转45度得到坐标系O2&#xff0c;求该点在坐标系O2中的坐标{A2,B2,C2}。 错误解法&#xff1a; 求出O1到O2的旋转旋转矩阵&#xff1a; 3D Rotation Conve…

Prototype, POC, MVP:区别与比较

在软件开发和产品设计领域&#xff0c;Prototype&#xff08;原型&#xff09;、Proof of Concept&#xff08;概念证明&#xff0c;简称POC&#xff09;和Minimum Viable Product&#xff08;最小可行产品&#xff0c;简称MVP&#xff09;是三个重要的概念。它们各自在项目的不…

在Ubuntu下安装samba实现和Windows系统文件共享

一、安装 apt install -y samba samba-clientSamba is not being run as an AD Domain Controller: Masking samba-ad-dc.service Please ignore the following error about deb-systemd-helper not finding those services. (samba-ad-dc.service masked) Created symlink /et…

Coast Landscape Racing Track(海岸景观赛道游戏场景)

这个包包含一个海岸景观,可用作赛道或第一人称动作游戏。 该场景有一个预先装饰的版本。 包括400多个道具来装饰现场。 墙和地面、skydome和所有纹理的碰撞网格都包括在内。 用于原型制作和游戏测试的完美场景。 纹理大小高达4096x4096 包括简单的海洋和游泳池动画水。 场景使…

树莓派pico入坑笔记,dht11使用及温湿度表制作

目录 关于树莓派pico和circuitpython的更多玩法&#xff0c;请看树莓派pico专栏 用到的库adafruit_dht&#xff0c;需要导入pico才能使用&#xff0c;在这里下载 样例程序 进阶玩法&#xff0c;显示信息的温湿度计 屏幕使用见树莓派pico专栏的ssd1306oled屏幕使用 代码 效…