算法题解记录20+++

题目描述:

        难度:简单

        给你一个链表的头节点 head ,判断链表中是否有环。

        如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

        如果链表中存在环 ,则返回 true 。 否则,返回 false 。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

  • 链表中节点的数目范围是 [0, 10^4]
  • -10^5 <= Node.val <= 10^5
  • pos 为 -1 或者链表中的一个 有效索引 。

解题准备:

        1.链表:链表是一个线性结构,其优点是在内存空间足够的情况下,可以任意增加节点,并且不会受到连续内存块的要求,因此非常灵活。缺点:对于结点node,node只能知道node之后的结点,无法得到node之前的结点【对于单链表】

        2.环:对于单链表,如果某个结点node,node的某个子孙结点i,i指向node,就称链表存在环。很容易看出一些性质:node结点一般有两个前驱结点【如果不是头结点】;如果尝试遍历整个链表,一定会陷入死循环;在遍历整个链表时,一定会重复出现某个序列;【不过,这些性质对于解题帮助不大】

        3.了解本题可能涉及的操作:既然要判断链表中是否有环,大概率涉及查找、比较,查找找到可能是环的结点,比较判断是否有环;总结:查找、比较。

        4.链表的查找:由于不确定链表长度,我们一般用while循环,从头节点,一直遍历到尾节点tail,结束条件利用tail一定指向null做判断。

        5.链表的比较:判断链表是否有环,需要使用结点node与结点i比较,判断二者的内存地址是否相同。

解题思路:

        不从技术的角度(即链表三板斧:快慢指针、栈、哑节点)出发,我们最容易想到的解决思路,大概就是:

        第一次思路:

        1.遍历一次链表,对每个节点访问记录+1;

        2.不断遍历,只要出现某个节点的访问记录>1,就说明链表有环。

        当然,不从技术性角度出发,这个思路是没有问题的,就算链表的入环点是头节点,第二次遍历到头节点时,其访问记录也一定为2;

        回归到实现:

        1.访问记录这个概念,怎么实现?

                1st.如果采用数组,数组应该多大?

                2nd.由于链表的val域不使用,我们可以在第遍历一次链表时,将val域数据=1,第二次遍历时,+1【当然,不推荐修改原数据】

                        11.问题是:如果val域原数据就是1怎么办?如果选用遍历一次,将所有数据置为x,那么又要考虑,如果链表有环,则不可能遍历结束!

                3rd.怎么判断之前是否经历过这个结点?我们已经剔除val域的想法,那么,是否需要记录先前经历过的所有结点?并且,在每次遍历时,将所有结点与某节点比较判断,查看是否有重复?

                        11.问题是:算法时间复杂度非常高,如果用ArrayList,设添加为O(n)【添加了n个结点】,如果在第n+1个结点得到重复的数,那么,对于第1个、第2个……到第n个结点,一共需要判断N!次;又因为涉及外部循环n次,所以算法复杂度1为O(n!*n);

        虽然题目对时间不限制,不过写起来也很麻烦,对于访问记录,几乎不可实现。

        如果没法做到访问记录,从哪一条路走呢?

        其实我们何必判断访问次数呢?只要遇到相同的结点,不就说明存在环吗?

        那么,干脆直接用ArrayList存储经历过的所有结点,只要新结点与ArrayList中的结点相同,就说明存在环。

        第二次思路:

        1.遍历链表,将结点加入ArrayList。

        2.判断新的结点,是否与ArrayList中数据相同,相同则为有环,返回true

        3.直到结点为null,说明链表不存在环,返回false。

        从技术性角度出发,这个也是可以实现的,不过时间复杂度与第一次思路相差无几,需要优化。

       假设本题有环,遍历到n+1时找到环结点。

        那么,遍历是n+1次,对ArrayList中数据判断,是(n+1)!次

        由于题目约束比较少,遍历的次数基本没法省略,又因为判断需要的时间太多,可以从此处优化。

        我们记得,在HashSet中,判断元素是否存在,效率是O(1)。

        干脆用HashSet优化。

        那么,思路就是:

        1.遍历链表,将结点加入HashSet

        2.判断新来的结点,在HashSet中是否存在?存在则有环返回true;

        3.一直到结点为null,说明链表无环,返回false;

        这样优化,时间复杂度大约在O(n),效率还是比较高的。

        另外,还有一种快慢指针的方法,具体的理论和实现在我的另一篇博客快慢指针:如何判断单链表是否有环-CSDN博客中详细说明

        其时间复杂度也是O(n),不过空间复杂度为O(1),在此不赘叙。

解题难点分析:

        本题朴素思路行不通的原因,是判断元素是否重复的算法比较难设计。

        如果要我说,就应该对HashMap、HashSet再多理解理解,其妙用确实很厉害。

代码:

public class Solution {public boolean hasCycle(ListNode head) {HashSet<ListNode> temp = new HashSet<>();// HashSet判断是否重复while(head!=null){if(temp.contains(head)){return true;}temp.add(head);head = head.next;}return false;}
}

  

以上内容即我想分享的关于力扣热题20的一些知识。

        我是蚊子码农,如有补充,欢迎在评论区留言。个人也是初学者,知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

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

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

相关文章

学术论文中常见的拉丁语及其缩写词汇解析

诸神缄默不语-个人CSDN博文目录 在学术写作中&#xff0c;作者经常会使用一系列的拉丁语及其缩写词。 1. et al. 全称&#xff1a; et alii 或 et alia意义&#xff1a; 和其他人使用场景&#xff1a; 当引用的文献有多个作者时&#xff0c;通常在第一作者后使用“et al.”表…

华为路由器基于接口限速

一、背景 ISP与企业内网通过华为路由器接入Internet时,当大量流量进入路由器时,可能会因为带宽不足产生拥塞,导致丢包,严重影响用户上网体验。对于此需要对网络流量进行限制,其方式通常有防火墙带宽策略、路由器基于接口限速等。 二、华为路由器基于接口限速方式 在路由…

卸载并升级pytorch安装torcheval

Requires Python > 3.8 and PyTorch > 1.11conda list torch 查看包 pip uninstall torch 及各个包&#xff0c;nvidia-smi查看cuda11.4&#xff0c;安装对应11.3去官网找cuda11.3和torch1.11.0并粘贴命令&#xff0c;再安装torcheval pip install torch1.11.0cu113 tor…

C#各大版本特性

总目录 C# 语法总目录 C#各大版本特性目录 C#各大版本特性C#10.0C#9.0C#8.0C#7.0C#6.0C#5.0C#4.0C#3.0C#2.0 C#各大版本特性 C#10.0 支持全局using语句&#xff1a;现在可以在整个项目中使用全局using语句&#xff0c;在所有文件中自动引用命名空间&#xff0c;不需要在每个文…

【看不懂命令行、.yaml?】Hydra 库极速入门

Hydra 是一个开源的 Python 框架&#xff0c;可以简化研究和其他复杂应用程序的开发。其核心功能是通过组合动态创建层次化的配置&#xff0c;并可以通过配置文件和命令行进行覆盖。Hydra 的名字来源于它能够运行多个类似的作业 - 就像一个多头的水怪一样。 主要特性: 从多个…

汇编语言——从键盘接收一个小写字母,找出它的前导字符和后续字符,再按顺序显示这三个字符

注意的点&#xff1a; 判断输入合法性a无前导字符z无后续字符 data segment data ends stack segment stackdw 100 dup (?)top label word stack ends code segmentassume cs:code,ds:data,ss:stack main proc farmov ax,datamov ds,axmov ax,stackmov ss,axlea sp,top L1: …

T31开发笔记: 移动侦测

若该文为原创文章&#xff0c;转载请注明原文出处。 最近在测试创安源IPC时发现摄像头的视频流有移动侦测功能 &#xff0c;拆解后发现使用的是T31,刚好手头上有淘宝买50多点的T31摄像头&#xff0c;就自己现在了个简易DEMO测试一下。 一、硬件和开发环境 1、硬件&#xff1a;…

RTT设备驱动框架学习(UART)

在serial.h中 struct rt_serial_device {struct rt_device parent;const struct rt_uart_ops *ops;struct serial_configure config;void *serial_rx;void *serial_tx;struct rt_spinlock spinlock;struct rt_device_notify rx_notify; } typedef struct rt_serial_device rt_…

C语言 分支控制语句之 if

然后 我们来说 流程控制语句之 if 选择控制结构 是通过 分支语句来实现的 其中 包括 单分支选择语句通过 (if) 来实现 双分支语句通过 (if) 和 (else) 实现 多分支语句通过 (if) (else if) (else) 实现 对于单分支来讲 它控制的语句就是 要嘛做 要嘛不做 好比如 放假了 你是…

【极速前进】20240422:预训练RHO-1、合成数据CodecLM、网页到HTML数据集、MLLM消融实验MM1、Branch-Train-Mix

一、RHO-1&#xff1a;不是所有的token都是必须的 论文地址&#xff1a;https://arxiv.org/pdf/2404.07965.pdf 1. 不是所有token均相等&#xff1a;token损失值的训练动态。 ​ 使用来自OpenWebMath的15B token来持续预训练Tinyllama-1B&#xff0c;每1B token保存一个che…

夜鸦国际服账号验证怎么办 夜鸦国际服账号认证的详细教程

夜鸦国际服账号验证怎么办 夜鸦国际服账号认证的详细教程 今天为大家带来的是《夜鸦》这款游戏&#xff0c;游戏背景是基于13世纪欧洲背景的MMORPG游戏&#xff0c;这款游戏以其沉浸式的游戏体验和流畅的打斗为特色。玩家可以选择战士、剑士、猎人或女巫等角色&#xff0c;体验…

AQS(AbstractQueuedSynchronizer)队列同步器源码解读

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. AOS、AQS、AQLS的区别 3. AQS的底层原理 3.1. 核心思想 3.2. 数…

李廉洋:4.23黄金休市之后大幅下跌,原油小幅度上涨。走势分析!

今年以来推动金价上涨的因素是亚洲的需求&#xff0c;很可能来自各国央行。最近又有零售买盘和一些金融买盘作为补充。目前的问题是&#xff0c;不断上升的债券收益率正在争夺资金。美国2年期国债的收益率接近5%&#xff0c;在美联储降息导致收益率开始下降之前&#xff0c;这仍…

JavaScript权威指南(第7版) 笔记 - 第 7 章 数组

能用代码说清楚的&#xff0c;绝不多废话&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; Linux创始人Linus的名言&#xff1a;Talk is cheap&#xff0c;show me the code ! &#xff0c;博主技术博文会精心给出能说明问题的范例代码&#xff01;…

JMeter--监听器--聚合报告

聚合报告&#xff08;Aggregate Report&#xff09; 可以查看事务或者取样器在某个时间范围内执行的汇总结果 右键 >>> 添加 >>> 监听器 >>> 聚合报告&#xff08;Aggregate Report&#xff09; Label 样本平均值中位数90% 百分位95% 百分位99% …

Qt实现XYModem协议(五)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据&#xff0c;并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…

35K的鸿蒙音视频开发岗位面经分享~

一个月前&#xff0c;阿里云在官网音视频终端 SDK 栏目发布适配 HarmonyOS NEXT 的操作文档和 SDK&#xff0c;官宣 MediaBox 音视频终端 SDK 全面适配 HarmonyOS NEXT。 此外&#xff0c;阿里云播放器 SDK 也在华为开发者联盟官网鸿蒙生态伙伴 SDK 专区同步上线&#xff0c;面…

lazarus-ide简介

Lazarus是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为使用Free Pascal编译器的Pascal语言设计。它支持快速应用开发&#xff08;RAD&#xff09;&#xff0c;允许开发者创建跨平台的图形用户界面&#xff08;GUI&#xff09;应用程序。以下是关于Lazarus的来…

面向对象设计与分析40讲(25)中介模式、代理模式、门面模式、桥接模式、适配器模式

文章目录 门面模式代理模式中介模式 之所以把这几个模式放到一起写&#xff0c;是因为它们的界限比较模糊&#xff0c;结构上没有明显的差别&#xff0c;差别只是语义上。 这几种模式在结构上都类似&#xff1a; 代理将原本A–>C的直接调用变成&#xff1a; A–>B–>…

负采样重要吗?它的理论与应用综述

Does Negative Sampling Matter? A Review with Insights into its Theory and Applications 负采样重要吗&#xff1f;它的理论与应用综述 Does Negative Sampling Matter? A Review with Insights into its Theory and Applications Zhen Yang, Ming Ding, Tinglin Huang,…