算法题解记录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的一些知识。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

伪逆矩阵的两种求法

当矩阵的行列不相等&#xff0c;矩阵不是方阵时&#xff0c;求解矩阵的逆&#xff0c;可以使用伪逆的方法。 求解伪逆有两种方式。本文以mxn&#xff08;m<n&#xff09;的矩阵求解为例。 方法1&#xff1a;右伪逆 对于一个矩阵 和矩阵&#xff0c;如何矩阵之间满足&#…

3D模型人物换装系统(五 模型核批之后模型uv不正确)模型UV不正确

3D模型人物换装系统&#xff08;五 模型核批之后模型uv不正确&#xff09;模型UV不正确 介绍展示Maya导入查看uvUnity中测试分析没合批为什么没有问题总结 介绍 最近在公司里给公司做模型优化合批的时候发现了模型的uv在合批之后无法正常展示&#xff0c;这里找了很多的原因&a…

hadoop安装记录

零、版本说明 centos [rootnode1 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)jdk [rootnode1 ~]# java -version java version "1.8.0_311" Java(TM) SE Runtime Environment (build 1.8.0_311-b11) Java HotSpot(TM) 64-Bit Server VM (…

讲座回顾|DolphinDB 携手上海高金共探量化前沿

4月16日&#xff0c;由上海高级金融学院 MBA 量化投资俱乐部和上海交通大学量化分析协会联合举办的量化公开课如期在上海举行。DolphinDB 创始人兼 CEO 周小华博士作为演讲嘉宾受邀出席&#xff0c;针对如何利用中高频数据挖掘因子的话题&#xff0c;为大家分享了行业的前沿应用…

Nginx 代理配置

最近&#xff0c;工作中遇到需要用到 Nginx 实现正向web代理和反向web代理的需求&#xff0c;其中反向web代理需要支持发送HTTP 和 HTTPS请求 1. 正向代理 1.1. 正向代理 流程 下面以访问百度为例解释正向代理过程&#xff1a; 客户将浏览器代理地址设置为代理服务器地址和服…

入门产品经理你一定要知道的事(上)

产品&#xff08;Product&#xff09;是任何可以让人注意、获取、使用、或能够满足某种消费需求的东西。可以是实体产品、服务、人、组织、地点、思想等。 狭义上产品特指互联网产品&#xff0c;是关于软件、硬件的集合体。本期文章所说的产品是指互联网产品。 产品经理&#…

Spring Boot中JUnit 4与JUnit 5的如何共存

文章目录 前言一、先上答案二、稍微深入了解2.1 maven-surefire-plugin是什么2.2 JUnit4和JUnit5有什么区别2.2.1 不同的注解2.2.2 架构 前言 在maven项目中&#xff0c;生成单测时是否有这样的疑问&#xff1a;该选JUnit4还是JUnit5&#xff1f;在执行 mvn test 命令时有没有…

跳表:高效索引的神奇算法

跳表&#xff08;Skip List&#xff09;的设计思想基于二叉查找树和链表&#xff0c;它采用了一种多层次的思路&#xff0c;通过随机化的方式在每个节点添加多个后继节点&#xff0c;从而实现快速查找 跳表是一种数据结构&#xff0c;它以一种分层的方式来存储数据&#xff0c;…

百面算法工程师 | 分类和聚类

目录 6.1 为什么正确率有时不能有效评估分类算法&#xff1f; 6.2 什么样的分类器最好&#xff1f; 6.3 什么是聚类&#xff0c;你知道哪些聚类算法&#xff1f; 6.4 K-Means聚类算法如何调优? 6.5 K-Means聚类算法如何选择初始点? 6.6 K-Means聚类聚的是特征还是样本 …

一文掌握:数据湖是什么?可不是数据仓库

一、什么是数据湖 数据湖&#xff08;Data Lake&#xff09;是指一个大型数据存储和处理系统&#xff0c;它能够存储各种类型和格式的数据&#xff0c;包括结构化数据、半结构化数据和非结构化数据。数据湖的目的是为了让企业可以更好地管理和利用大量的数据&#xff0c;以便进…

Email API的安全性如何保障?API发信技巧?

Email API有哪些主要功能&#xff1f;如何选择邮箱API进行集成&#xff1f; Email API在企业和个人用户之间发挥着举足轻重的作用。然而&#xff0c;随着Email API的广泛应用&#xff0c;其安全性问题也逐渐凸显出来。那么&#xff0c;Email API的安全性究竟如何保障呢&#x…

基于 Grassmannian Manifold的动态图嵌入学习的脑网络时空枢纽识别

Spatiotemporal Hub Identification in Brain Network by Learning Dynamic Graph Embedding on Grassmannian Manifold 摘要 神经成像技术的进步使得测量不同大脑区域之间的连接随时间演变成为可能。新出现的证据表明&#xff0c;一些关键的大脑区域&#xff0c;称为枢纽节点…

adb工具使用

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

社会工程渗透测试教程(二)

原文&#xff1a;annas-archive.org/md5/db987a87e1478b8a8617c263c631b477 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第六章&#xff1a;通过有效的威胁建模确保价值 Richard Ackroyd&#xff0c;随机风暴有限公司高级安全工程师 大多数客户意识到他们需要社会…

20.Unity飞机大战游戏

1任务&#xff1a;使背景图动起来 2任务&#xff1a;飞机换帧动画 3任务&#xff1a;让飞机发射子弹 4任务&#xff1a;敌机出现 5任务&#xff1a;控制飞机 6任务&#xff1a;游戏碰撞逻辑 7任务&#xff1a;另外两种类型的敌机 8任务&#xff1a;拾取奖励物品换枪 9…

RK3568 学习笔记 : u-boot 通过 tftp 网络更新 u-boot自身

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 AtomPi-CA1 使用 虚拟机 ubuntu 20.04 收到单独 编译 RK3568 u-boot 使用 rockchip Linux 内核的设备树 【替换】 u-boot 下的 rk3568 开发板设备树文件&#xff0c;解决 u-boot 下千兆网卡设备能识别但是无法 Pi…

vulfocus靶场名称: apache-cve_2021_41773/apache-cve_2021_42013

Apache HTTP Server 2.4.49、2.4.50版本对路径规范化所做的更改中存在一个路径穿越漏洞&#xff0c;攻击者可利用该漏洞读取到Web目录外的其他文件&#xff0c;如系统配置文件、网站源码等&#xff0c;甚至在特定情况下&#xff0c;攻击者可构造恶意请求执行命令&#xff0c;控…

JAVA学习笔记30(线程)

1.线程 1.线程的概念 1.线程是由进程创建的&#xff0c;是进程的一个实体 2.一个进程可以拥有多个线程 2.并发 ​ *同一时刻&#xff0c;多个任务交替执行&#xff0c;造成一种"貌似同时"的错觉&#xff0c;单核cpu实现的多任务就是并发 3.并行 ​ *同一时刻&…

电商平台业务及架构演变史

不少人认为电商系统很简单&#xff0c;因为现在做电商的太多了&#xff0c;看到的电商产品也多。看来看去产品都差不多&#xff0c;没什么特别。 其实中国电商发展已有20多年历史&#xff0c;电商以销售为核心连接着研、产、供、销、服整套的信息系统体系。其中的设计并没有那…

Mongodb支持事务吗?

一、概念 1.1、MongoDB事务简介 MongoDB 是一个非关系型数据库管理系统&#xff0c;最初并不支持事务。然而&#xff0c;随着时间的推移&#xff0c;MongoDB 在其4.0版本中引入了多文档事务支持&#xff0c;使得在单个集合中执行多个操作成为可能。 In MongoDB, an operation…