[Leetcode]经典算法

news/2024/10/6 1:22:30/文章来源:https://www.cnblogs.com/DCFV/p/18288530

检测环

快慢指针法是一种用于检测链表中是否存在环的有效方法,同时也可以找到环的起点。该方法的原理基于两个指针在链表上同时移动,其中一个移动得更快,而另一个移动得更慢。

  1. 检测环的存在:

    • 使用两个指针,一个称为快指针(fast),一个称为慢指针(slow)。
    • 在每一步中,快指针向前移动两步,而慢指针只移动一步。
    • 如果链表中不存在环,那么快指针最终会到达链表的尾部,此时可以确定链表中无环。
    • 如果链表中存在环,由于快指针的速度比慢指针快,它们最终会相遇。
  2. 找到环的起点:

    • 一旦快慢指针相遇,说明链表中存在环。
    • 将其中一个指针(例如慢指针)重新移到链表的头部,保持另一个指针在相遇点。
    • 然后,两个指针以相同的速度前进,直到它们再次相遇。这次相遇点就是环的起点。

为什么这个方法有效?

  • 如果链表中不存在环,快指针将最终到达链表的尾部,而慢指针也会到达链表的末尾。由于没有环,两者不会相遇。
  • 如果链表中存在环,快慢指针最终会在环中的某一点相遇。此时,将其中一个指针移到链表头部,它们再次相遇的地方就是环的起点。

这个方法的时间复杂度为O(N),其中N是链表的长度。因为快指针每次移动两步,而慢指针每次移动一步,所以快指针最多需要N/2步就能遇到慢指针。在找到相遇点后,重新移动指针的过程最多需要再走N步。

证明

让我们来证明一下,为什么上面两个说法是正确的。

首先,进入环之前的路越长,快慢指针之间的差距就越大,如果这段路足够长,甚至会出现快指针已经在环里面走了好几圈,但是慢指针还没有进入环的情况。

但是不管前面的路有多长,不管慢指针进入环的时候,快指针在环的哪个位置,慢指针进入环以后,快指针总是可以在慢指针走不到一圈的时候追上他,因为慢指针在环内走了一圈的时候,快指针已经走了两圈,一定可以追得上。

image

下面我们来列算式

进入环之前的路长度为:P

慢节点在环内走过的路为:S

环的总长度为:C

慢指针总共走过的长度:P+S

那么快指针走过的总长度:2(P+S)

快指针在环内走过的长度:P+2S

快慢指针相遇的时候,他们处在同一个位置上:S%C = (P+2S)%C

化简,(P+S)%C = 0,也就是说(P+S) = NC

现在我们在位置S上,再走P的长度就可以回到环的起点。

先来看如何判断是否有环

Leetcode 141. 环形链表

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

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

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

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:if not head:return Falsefast = headslow = headwhile fast.next and fast.next.next:fast = fast.next.nextslow = slow.nextif fast == slow:return Truereturn False

再来看环的起点在哪里

LCR 022. 环形链表 II

给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

说明:不允许修改给定的链表。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def detectCycle(self, head: ListNode) -> ListNode:if not head:return Falsefast = headslow = headwhile fast.next and fast.next.next:fast = fast.next.nextslow = slow.nextif fast == slow:fast = headwhile fast != slow:fast = fast.nextslow = slow.next  return fastreturn False

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

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

相关文章

关于import multiprocessing引用出错

关于import multiprocessing引用出错 0. 原因 当前文件名与python包体中关键词出现同名,导致循环引用 1. 排查过程 问题代码 import timefrom multiprocessing import Process, Queue # 这里提示错误def producer(queue):queue.put("a")time.sleep(2)def consumer(q…

进程信号

进程信号的产生,本质,进程信号的操作,进程信号的底层实现,以及阻塞信号,屏蔽信号1. 信号的产生 1.1 信号概念在生活中有很多的信号在我们身边围绕,例如红绿灯,发令枪,上课铃等等 在接受到信号,我们可以做出三种动作 1.立马去做对应信号的事情 2.等一会再做,有自己的…

24-暑假软件工程日报(7_7)

工作时间:7月7日 14:00-17:00 工作内容: 基本完成第二阶段大程序构建 代码:#include <cstring> #include <iostream> #include <list> #include <math.h> #include <queue> #include <stack> #include <stdio.h> #include <st…

[CISCN2019 华北赛区 Day2 Web1]Hack World

进入题目 输入数字1数字20对select 空格 union or 等等测试发现没有过滤select 空格也被过滤 注意不能单独测试用亦或运算 1^0为真 尝试0^if((ascii(substr((select(flag)from(flag)),1,1))=100),0,1) 回显正常根据回显判断正误 编写脚本爆破,由于该网站请求太快会报429,请求…

CubeMx的部分配置显示不出来

现象描述:CubeMx的部分配置显示不出来 处理方法:(1)继续进行其他配置,给工程起名字,并生成代码;(2)关闭CubeMx后再次打开

[CISCN2019 华东南赛区]Double Secret

进入题目由于请求不能过快,目录扫描工具失效可写脚本, 根据题目两个secret,猜测有serect目录 访问猜测还有一个secret参数随意输入发现源码泄露 注意到有flask,考虑python模板注入 注意到发现rc4加密 找师傅的加密脚本 import base64 from urllib.parse import quote def rc4…

[CISCN2019 华东南赛区]Web11

进入题目注意到xff 在url处随意输入目录xff随之变化 注意下放smarty是php模板 猜测xff为模板注入点 如下用if标签看到回显得到flag flag{6efda977-94fb-4d30-8668-fe28458ec2bf}

game1

进入题目发现是一个游戏发现有一个score.php的发包 发现有分数等 对比不同分数的包发现sign值都有ZM后疑似为base64于是将分数改为较高的分,ZM+base64 尝试要补一个=得到flag

[CISCN 2019 初赛]Love Math

进入题目,直接源码 代码审计、看师傅wp有黑名单字符过滤,有白名单函数过滤 于是用编码绕过,利用eval函数执行命令,system(cat /flag.txt) base_convert(a,b,c) //将数值a按b进制转换为c进制 dechex //将10进制转成16进制 hex2bin() //16进制转成字符串 base_convert(37907…

babyweb国赛华东北

进入题目目录扫描 扫出ssrf.php 发现url尝试用file协议访问/flag.txt拿到flag

人脸识别签到系统一站式开发【基于Pyqt5的CS架构软件】

人脸识别签到系统:课堂签到,上班打卡,进出门身份验证。 功能:人脸录入,打卡签到,声音提醒,打卡信息导出,打包exe文件人脸识别签到系统 1、运用场景 课堂签到,上班打卡,进出门身份验证。 2、功能架构 人脸录入,打卡签到,声音提醒,打卡信息导出:3、技术栈 python3.8…

本地管理员

进入题目 随意输入密码发现提示ip,则尝试xff伪造ip右键检查发现base64编码 解码得猜测为用户admin密码 抓包发包得到flag