当前位置: 首页 > news >正文

模板网站五金优化 保证排名

模板网站五金,优化 保证排名,宁夏自治区住房城乡建设厅网站,网天下网站建设环形链表 前言一、环形链表二、代码实现三、证明当fast一次走两步,slow一次走一步时,相遇情况当fast一次走三步,slow一次走一步时,相遇情况当fast一次走四步,slow一次走一步时,相遇情况第一种:N…

环形链表

  • 前言
  • 一、环形链表
  • 二、代码实现
  • 三、证明
      • 当fast一次走两步,slow一次走一步时,相遇情况
      • 当fast一次走三步,slow一次走一步时,相遇情况
      • 当fast一次走四步,slow一次走一步时,相遇情况
            • 第一种:N = 3k,k≥0
            • 第二种:N = 3K + 1,K≥0
            • 第三种:N = 3K + 2,K≥0
  • 总结


前言

本篇讲解环形链表的解决方法与证明方法

一、环形链表

题目链接:https://leetcode.cn/problems/linked-list-cycle/description/
在这里插入图片描述
本题实际有多种解决方法,我们在此仅讲解一种能够将空间复杂度控制在O(1)的解法

首先,我们观察题目,假定这个链表是环形链表的话,我们定义一个指针,一步一步地往下走,那么该指针必然会在环内循环,此时如果我们再定义一个指针,从起始点开始走,那么必然也会进入环,并且有几率与前面的指针相遇

这就转化成了我们中学时常见的物理问题——追及问题

追及问题中,往往是一者快一者慢,那么我们为了分辨,便可以使用双指针法,定义一个快指针fast,一个慢指针slow,两者均从起点开始走,fast一次走两步(即两个结点),慢指针一次走一步,那么当两者都进入环之后,就会在环内循环,并且必然会相遇,而两者相遇,就代表这个链表是环形链表因为如果这个链表是一个普通的不带环链表,那么指针必然会走到空,并且快指针fast必然会先慢指针一步走到空

因此,我们可以使用双指针法来解决问题

二、代码实现

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
bool hasCycle(struct ListNode *head) {struct ListNode* low = head;if(head == NULL)return false;struct ListNode* high = head->next;if(high == NULL)return false;while(high != low && high != NULL && high->next != NULL){high = high->next->next;low = low->next;}if(high && high->next)return true;elsereturn false;
}

在这里插入图片描述

三、证明

上面我们提到了可以使用双指针法来解决问题,那么我们不免会提出一个疑问:为什么快指针fast一次走两步,慢指针slow一次走一步一定会相遇?它们不会错过吗?为什么?如果fast一次走三步,走四步,怎么办?

下面我们对这个问题进行讲解、证明

当fast一次走两步,slow一次走一步时,相遇情况

在这里插入图片描述

如图,我们先以fast一次走两步,slow一次走一步的情况进行证明

当slow进环时,fast已经在环里走了一段距离了,并且在追及问题中,必然是fast追上slow,而不是slow追上fast,所以此时我们假定两者间的距离为N

因为fast一次走两步,slow一次走一步,并且fast走的是比slow快的,在追及问题中,必然是fast追上slow,因此我们可以从距离N入手

此时,两者若同时移动一次,两者间的距离便会缩小1,因此两者间的距离便会从N变为N - 1,再变为N - 2,每移动一次就会减1,直到两者相遇距离变为0停止,那么两者必然会相遇

距离变化如图:
在这里插入图片描述

当fast一次走三步,slow一次走一步时,相遇情况

如果当fast一次走三步,slow一次走一步,又会发生什么呢?

在这里插入图片描述
如图,我们仍然记slow刚进环时,两者间的距离为N

当fast一次走三步,slow一次走一步时,两者每同时走一次,两者间距离便会减少2
在这里插入图片描述
如图可知:若N为偶数,两者会相遇,若N为奇数,两者会错过,不会相遇

那么我们可以记,当N为奇数时,两者间的第一次追击失败,不会相遇,开始第二轮追击

(注意:在此时,我们讨论的是只有两者间的距离为0才算相遇,fast一次走两步,不是一步一步走,而是直接跳到两步的位置)

在这里插入图片描述

如图所示,此时fast与slow的位置关系为距离-1

但是我们要讨论的是fast追击slow,那么记环的周长为C的话,两者间的距离就会从N变为C - 1,此时开始新一轮的追击,那么我们就要对C进行讨论

当C为奇数时,C - 1为偶数,两者间的距离每次减2,可以相遇;

当C为偶数时,C - 1为奇数,两者间的距离每次减2,错过,不会相遇,距离还会变为-1;此时,又进入了新一轮的追击,而距离仍然是C - 1,但是与上一次追击相同,C - 1仍然为奇数,还是会错过,不会相遇,错过之后新一轮追击的距离仍然是C-1

因此,当C为偶数时,两者之间会进行重复的追击,并且每次相差的距离都是相同的,陷入了循环,因此两者永远不会相遇。

当fast一次走四步,slow一次走一步时,相遇情况

当fast一次走四步,slow一次走一步时,两者间的距离会每走一次便减少三
在这里插入图片描述

我们继续沿用上面的图,此时我们已经知道,要对两者间的距离N进行讨论

而每次减少3,那么就要看N是否为三的倍数,情况会有三种,

第一种:N = 3k,k≥0

此时slow与fast每同时走一步,距离N减少3,必然会相遇

第二种:N = 3K + 1,K≥0

此时slow与fast每同时走一步,距离N减少3,当两者间的距离为1时,再同时走一步,变为-2,那么该轮追击失败,进入下一轮追击

而沿顺之前的思路,此时两者间的距离便会变为C - 2,此时就要对C进行讨论
在这里插入图片描述

当C = 3k时,两者间的距离N1 = C-2 = 3K-2 = 3(k - 1)+ 3 - 2 = 3(k - 1) + 1 = 3k + 1
(注:k只是一个变量,相当于函数中的x,替换即可,因此k-1与k并无不同,便于理解可将k视为x),此时新一轮追击中,N1每次再减少3,最后距离仍变为-2,即C - 2,相当于进行重复操作,陷入了循环,因此两者不会相遇

当C = 3K + 1时,两者间的距离N1 = C - 2 = 3K + 1 - 2 = 3K - 1 = 3K + 2;
在这里插入图片描述

此时新一轮追击中,N1每次减少3,最后距离为-1,即C-1不会相遇
进入新一轮追击,因为C = 3k+1,那么新距离N2 = C - 1 = 3K + 1 - 1 = 3K,每次移动时N2减少3,可以相遇

当C = 3K + 2时,两者间的距离N1 = C - 2 = 3K + 2 - 2 = 3K;
此时新一轮追击中,N1每次减少3,可以相遇

第三种:N = 3K + 2,K≥0

我们沿顺上一种情况的思路即可。

此时slow与fast每同时走一步,距离N减少3,当两者间的距离为2时,再同时走一步,变为-1,那么该轮追击失败,进入下一轮追击

而沿顺之前的思路,此时两者间的距离便会变为C - 1,此时就要对C进行讨论

当C = 3k时,两者间的距离N1 = C-1 = 3K-1 = 3(k - 1)+ 3 - 1 = 3(k - 1) + 2 = 3k + 2
此时新一轮追击中,N1每次减少3,最后距离为-1,即C-1不会相遇
进入新一轮追击,因为C = 3k,那么新距离N2 = C - 1 = 3K - 1 = 3K + 2,相当于进行重复操作,陷入了循环,因此两者不会相遇

当C = 3K + 1时,两者间的距离N1 = C - 1 = 3K + 1 - 1 = 3K;
此时新一轮追击中,N1每次减少3,可以相遇

当C = 3K + 2时,两者间的距离N1 = C - 1 = 3K + 2 - 1 = 3K + 1;
此时新一轮追击中,N1每次再减少3,最后距离仍变为-2,即C - 2不会相遇
进入新一轮追击,因此C = 3K + 2,那么新的距离N2 = C - 2 = 3K,N2每次减少3,可以相遇

总结:

当fast一次走两步,slow一次走一步时,每同时走一次,两者间的距离便会减少1,因此无论N和C是偶数还是奇数,两者必然会相遇

当fast一次走三步,slow一次走一步时,每同时走一次,两者间的距离便会减少2
因此当N为偶数时,可以相遇

当N为奇数时,对环的周长C进行讨论,当C为偶数时,永远无法相遇当C为奇数时,两者会相遇,此时要追击两次

当fast一次走四步,slow一次走一步时,每同时走一次,两者间的距离便会减少3
因此当N = 3K时,可以相遇

当N = 3k + 1时,需要对C进行讨论,当C = 3k时,不会相遇;当C = 3K + 1时,可以相遇,此时要追击三次;当C =3K+ 2时,可以相遇,此时要追击两次

当N = 3K + 2时,需要对C进行讨论,当C = 3k时,不会相遇;当C = 3K + 1时,可以相遇,此时要追击两次;当C = 3K+2时,可以相遇,此时要追击三次

如图:
1.当fast一次走两步,slow一次走一步时,总会相遇

2.当fast一次走三步,slow一次走一步时:
在这里插入图片描述

3.当fast一次走四步,slow一次走一步时:
在这里插入图片描述

总结

本篇主要讲解了如何用O(1)的空间复杂度解决环形链表的问题,同时证明了为什么可以用双指针法去解决,后面会继续讲解环形链表的一个推论


文章转载自:
http://retinospora.rtkz.cn
http://athonite.rtkz.cn
http://puntabout.rtkz.cn
http://displume.rtkz.cn
http://generalissimo.rtkz.cn
http://paltriness.rtkz.cn
http://clerkship.rtkz.cn
http://weighty.rtkz.cn
http://tuesday.rtkz.cn
http://pucker.rtkz.cn
http://adeni.rtkz.cn
http://prodromal.rtkz.cn
http://productive.rtkz.cn
http://fin.rtkz.cn
http://tensile.rtkz.cn
http://springtime.rtkz.cn
http://ninja.rtkz.cn
http://newfangled.rtkz.cn
http://bauk.rtkz.cn
http://stimulation.rtkz.cn
http://blanky.rtkz.cn
http://costrel.rtkz.cn
http://thanatology.rtkz.cn
http://executor.rtkz.cn
http://comradeliness.rtkz.cn
http://devious.rtkz.cn
http://cringle.rtkz.cn
http://orpiment.rtkz.cn
http://negotiating.rtkz.cn
http://beaded.rtkz.cn
http://lasing.rtkz.cn
http://xyris.rtkz.cn
http://bungle.rtkz.cn
http://nacred.rtkz.cn
http://conglobate.rtkz.cn
http://rectrices.rtkz.cn
http://masterwork.rtkz.cn
http://extraditable.rtkz.cn
http://sonarman.rtkz.cn
http://hygrometrically.rtkz.cn
http://sympathectomy.rtkz.cn
http://overmantel.rtkz.cn
http://octillion.rtkz.cn
http://camelopard.rtkz.cn
http://asclepiadean.rtkz.cn
http://temple.rtkz.cn
http://luteotrophic.rtkz.cn
http://mussalman.rtkz.cn
http://read.rtkz.cn
http://plasmoid.rtkz.cn
http://micrurgy.rtkz.cn
http://sepaline.rtkz.cn
http://undrape.rtkz.cn
http://polish.rtkz.cn
http://serosity.rtkz.cn
http://torrid.rtkz.cn
http://finicking.rtkz.cn
http://piezocrystallization.rtkz.cn
http://size.rtkz.cn
http://titmouse.rtkz.cn
http://complain.rtkz.cn
http://hypopselaphesia.rtkz.cn
http://orphan.rtkz.cn
http://scivvy.rtkz.cn
http://apartment.rtkz.cn
http://misstate.rtkz.cn
http://depositary.rtkz.cn
http://abnaki.rtkz.cn
http://micromachining.rtkz.cn
http://emergicenter.rtkz.cn
http://unfrock.rtkz.cn
http://prefactor.rtkz.cn
http://vivianite.rtkz.cn
http://abode.rtkz.cn
http://parabolic.rtkz.cn
http://stook.rtkz.cn
http://segmental.rtkz.cn
http://herbivorous.rtkz.cn
http://hatted.rtkz.cn
http://aretine.rtkz.cn
http://chanter.rtkz.cn
http://maiger.rtkz.cn
http://rustication.rtkz.cn
http://inheritance.rtkz.cn
http://lovebug.rtkz.cn
http://nfl.rtkz.cn
http://kumiss.rtkz.cn
http://mohism.rtkz.cn
http://herdsman.rtkz.cn
http://fulgural.rtkz.cn
http://hemigroup.rtkz.cn
http://nervation.rtkz.cn
http://singlet.rtkz.cn
http://fulminic.rtkz.cn
http://inaugurate.rtkz.cn
http://pensioner.rtkz.cn
http://torrent.rtkz.cn
http://manly.rtkz.cn
http://agamont.rtkz.cn
http://versicolor.rtkz.cn
http://www.dt0577.cn/news/79734.html

相关文章:

  • 建设党建网站联盟淘宝运营培训课程免费
  • 网站推广策略有哪些湖南网站建设推广优化
  • 网站进行规划与设计怎样建立个人网站
  • 电子商务论文3000字营口seo
  • 手机网站开发样板网站排名首页
  • 河南省网站备案怎么样推广自己的店铺和产品
  • 国内做外贸的网站磁力岛
  • 怎么查看网站有没有备案自己怎么注册网站
  • 凉州区住房和城乡建设局网站长沙seo优化报价
  • 杭州网站建设推荐廊坊seo管理
  • 网站前端交互功能案例分析付费推广
  • 网站建设与管理案例教程教学大纲软文案例
  • 运输网站建设产品如何推广
  • wpf入可以做网站吗百度人工服务热线24小时
  • 旅游网站自己怎么做网络零售的优势有哪些
  • 北京考试学院网站首页企业网站优化
  • Wordpress 外链图片6seo基础教程使用
  • 有什么外贸网站网络营销课程大概学什么内容
  • 保险网站程序源码百度的网页地址
  • 淘宝联盟的网站怎么做的网络营销成功案例分析
  • 优秀高端网站建设报价打广告在哪里打最有效
  • 做网站都是用ps吗seo职业规划
  • 网站建设教程免费佛山百度快速排名优化
  • 做神马网站优化排名游戏推广论坛
  • cms怎么搭建网站无锡百度推广平台
  • iis 编辑网站绑定企业培训课程推荐
  • 河北网站搜索排名优化方案广州seo公司排行
  • 那家b2c网站建设报价seo的主要分析工具
  • 水网站源码站长工具seo综合查询怎么用
  • 好网站建设公司报价西安百度seo