技术宅小伙:计算机新手学习系列之LeetCode!

Posted 技术宅小伙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术宅小伙:计算机新手学习系列之LeetCode!相关的知识,希望对你有一定的参考价值。

哈喽大家好,我是技术宅小伙。

自从上次发了这个入门系列后,出乎我的意料,这个系列居然是最受欢迎的。我各种被催更,呼声最高的就要数数和图的题了。那今天就给大家带来一道基础的图吧,让我们一起来看一下 Lico 第 1971 题 fine if path existing graph。

这道题的题目是说,已知一个有 n 个节点的双向的图(双向也可以是无向),它的每一个节点都从 0 标记到 n 减 1,又已知一个 2 滴的 integer r 来记录这个 graph edges。这个 already 的每一个 element 都记录着这一个边所连接的两个 vertex。每两个节点之间最多只会有一条边,并且没有任何节点会有指向自己的边。

我们现在需要判断的是,在这幅图里,有没有一条可以从起点通往终点的路径。如果有这个路径我们就返回 true,没有这个路径我们就返回 false。

从第一个例子里就可以看出,这道题只是想让我们判断有没有可行的路径,并没有让我们找出最短路径,所以这道题只需要一个最简单的便利就好了。那我们先用 breath-for-search 来做吧。题目给出的例子太简单了,让我们自己来举一个稍微复杂一点的例子来做这道题。

比如我们现在有这样的一组编,他画出来图是这样的,我们的 source 是 0,the destination 是 4。来到这个 h 的数组,我们现在暂时还没有办法很有效率的利用它,但我们可以先用它来建一个 adjacent 的 list,也就是把每一个节点的相邻节点都找出来,并放进一个 list 里。然后所有这些节点的这些 list 都按着顺序来放进一个更大的 list 里。

所以我们现在先建一个有 n 个空 list 的大 list,initialize 好了这个 adjacent list 后,我们就可以一个一个的来 process 就是 edge 了。每拿出一个 edge,我们就把这两个节点放进对方的 list 里,比如取出零一就先把 0 放进 1 的 list,1 放进 0 的 list,再取出 03 也一样把 0 放进 3 的 list,3 放进 0 的 list,然后继续 121324,最后二三结束后,这个 adjacent list 里就存放着每一个节点的邻居们了,比如 0 连着 1、2,1 连着 0、2、3,以此类推。

听好这个 adjacent list 后,我们就可以开始 search 了。因为这个是 graph,所以里面可能会有环,为了不进入环里并且无限循环下去,我们需要记录一下哪些节点是我们已经见到过了的,再记录一下哪些节点是接下来要做对比的。

因为是 BFS 嘛,我们就先建一个 queue(first in first out)并且把这个 source 放进去作为第一个 element,再来记录一下我们已经见过了哪些,因为这个 queue 记录的是我们将要去做对比的 element,所以我们这里需要用一个 while loop 来看一下这个 queue 里面还有没有剩余的 element。如果 queue 不是空的话,也就是说里面还有 element 需要我们继续去做对比的话,我们就继续录下去。从 queue 里面取出第一个 element 来作为当前的节点。如果当天这个节点它就是 destination 的话,那说明我们已经找到了一条可通行的路径了,这时候我们就只需要返回 true 就好了。如果它并不是 destination 的话,那这时候我们就得继续找下去。

我们就把它的邻居再放进这个 queue 里面。但我们不能盲目的把它们全部都扔进 queue 里,因为这个邻居可能是我们已经见过的节点,我们不想要进入一个循环,然后一直不停的循环下去。所以我们要先确认一下这些邻居是我们没有见到过的,它是我们没有见过的我们再放进 queue 里,然后这时我们已经见过了,所以我们再把它给加入 visit。

好了,这个循环他就可以一直不停的找下去,直到他找到了一条可通行的路径或者他的 queue 里面没有任何东西可以看了,就像第二个 example 里面一样,我们的 source 所在的这个 subgraph 里面,他的所有节点都被我们看完了,但是他还是没有找到他的 destination,那么就证明这个 source 和 destination 之间没有任何一条联通的路,我们就可以返回 false 了。

要提到这里大致的逻辑已经出来了,但是有一个 case 我们并没有考虑到。因为每个节点它都不会有一条通向自己的边,所以如果它的 root 和 destination 是同一个节点的话,这个情况会被漏掉。最简单的修改就是直接在最开始做一个判断,如果他俩相等的话,这个图里也是有可通行的路径的,并且这个路径只包含一个 vertex。

好啦,现在我们应该是做完了。这个文章如果对你有所帮助的话,记得点赞收藏转发。什么地方我没有讲清楚的话,记得在弹幕或评论区里告诉我。我是不会写代码的,阿静我们下个文章见,拜拜!

大家好,我是技术宅小伙。

自从上次发了这个入门系列后,出乎我的意料,这个系列居然是最受欢迎的。我各种被催更,呼声最高的就要数数和图的题了。那今天就给大家带来一道基础的图吧,让我们一起来看一下 Lico 第 1971 题 fine if path existing graph。

这道题的题目是说,已知一个有n个节点的双向图(双向也可以是无向),它的每一个节点都从0标记到n 减1,又已知一个2元的integer r来记录这个图的边。这个already的每一个element都记录着这一个边所连接的两个vertex。每两个节点之间最多只会有一条边,并且没有任何节点会有指向自己的边。

我们现在需要判断的是,在这幅图里,有没有一条可以从起点通往终点的路径。如果有这个路径我们就返回true,没有这个路径我们就返回false。

从第一个例子里就可以看出,这道题只是想让我们判断有没有可行的路径,并没有让我们找出最短路径,所以这道题只需要一个最简单的遍历就好了。那我们先用BFS来做吧。题目给出的例子太简单了,让我们自己来举一个稍微复杂一点的例子来做这道题。

比如我们现在有这样的一组编,他画出来图是这样的,我们的source是0,the destination是4。来到这个h的数组,我们现在暂时还没有办法很有效率的利用它,但我们可以先用它来建一个adjacent的list,也就是把每一个节点的相邻节点都找出来,并放进一个list里。然后所有这些节点的这些list都按着顺序来放进一个更大的list里。

所以我们现在先建一个有n个空list的大list,initialize好了这个adjacent list后,我们就可以一个一个的来process就是edge了。每拿出一个edge,我们就把这两个节点放进对方的list里,比如取出零一就先把0放进1的list,1放进0的list,再取出03也一样把0放进3的list,3放进0的list,然后继续121324,最后二三结束后,这个adjacent list里就存放着每一个节点的邻居们了,比如0连着1、2,1连着0、2、3,以此类推。

听好这个adjacent list后,我们就可以开始search了。因为这个是graph,所以里面可能会有环,为了不进入环里并且无限循环下去,我们需要记录一下哪些节点是我们已经见到过了的,再记录一下哪些节点是接下来要做对比的。

因为是BFS嘛,我们就先建一个queue(first in first out)并且把这个source放进去作为第一个element,再来记录一下我们已经见过了哪些,因为这个queue记录的是我们将要去做对比的element,所以我们这里需要用一个while loop来看一下这个queue里面还有没有剩余的element。如果queue不是空的话,也就是说里面还有element需要我们继续去做对比的话,我们就继续录下去。从queue里面取出第一个element来作为当前的节点。如果当天这个节点它就是destination的话,那说明我们已经找到了一条可通行的路径了,这时候我们就只需要返回true就好了。如果它并不是destination的话,那这时候我们就得继续找下去。

我们就把它的邻居再放进这个queue里面。但我们不能盲目的把它们全部都扔进queue里,因为这个邻居可能是我们已经见过的节点,我们不想要进入一个循环,然后一直不停的循环下去。所以我们要先确认一下这些邻居是我们没有见到过的,它是我们没有见过的我们再放进queue里,然后这时我们已经见过了,所以我们再把它给加入visit。

好了,这个循环他就可以一直不停的找下去,直到他找到了一条可通行的路径或者他的queue里面没有任何东西可以看了,就像第二个example里面一样,我们的source所在的这个subgraph里面,他的所有节点都被我们看完了,但是他还是没有找到他的destination,那么就证明这个source和destination之间没有任何一条联通的路,我们就可以返回false了。

要提到这里大致的逻辑已经出来了,但是有一个case我们并没有考虑到。因为每个节点它都不会有一条通向自己的边,所以如果它的root和destination是同一个节点的话,这个情况会被漏掉。最简单的修改就是直接在最开始做一个判断,如果他俩相等的话,这个图里也是有可通行的路径的,并且这个路径只包含一个vertex。

好啦,现在我们应该是做完了。这个文章如果对你有所帮助的话,记得点赞收藏转发。什么地方我没有讲清楚的话,记得在弹幕或评论区里告诉我。我是不会写代码的,阿静我们下个文章见,拜拜!

技术宅学习Linux系统还是很有前途的

老实说,我之所以入了Linux的坑,纯粹只是为了追我现在的男朋友,也就是技术宅。如果不是为了追我男朋友的话,我估计我这辈子都不会去接触linux。好吧,今天写一写过往事情,也是为了怀念当初追男友的一些故事吧。

我大学专业是金融管理,现在的男友专业是计算机。男友是那种性格极其沉闷的人,也不愿意参与任何社交的活动。按理说,男友这样的性格,又和自己不是一个专业,我们应该难以认识的。但是有时候上天就会这么悄悄眷顾你的爱情。在一次大课的时候,我们专业和计算机专业安排一起上课。那天上课的时候,我刚好迟到,于是就只能偷偷从教室后门溜进去,坐到最后一排。那天凑巧,我现在的男友也刚好坐在最后一排。那天的他,穿着干干净净的白色衬衫,低着头看着一本书,还时不时做着笔记。我承认当时被男友那股帅气迷人的学习劲给迷倒了。我以为男友是在学习大课知识,结果我将头凑向他的时候,却看到他在看一本编程的书。我记得当时,我还拍了拍他肩膀,还跟他打趣说:“同学,上课期间,不要看跟本课程无关的书籍哦。”结果,现在的男友瞪了我一眼,然后说了一句:“学自己认为有价值的东西就行”,然后就继续看他的“天文”书,也没理睬我。

所以呀,我好气呀。我从小到大就是那种自己想要的一定要努力争取的性格。而那堂课后,我就一直在想那节课的印象,我自己内心也很肯定他就是我所想要的男朋友类型。于是我就托朋友打听关于他的信息与消息。大概就是他是技术宅,喜欢搞技术,甚至从他室友那知道,他一天除了上课,就是在宿舍对着电脑噼里啪啦打着键盘,连宿舍活动都不参加。知道这些事情我尝试各种各样的方式跟现在男友交流,不过他却对我爱理不理。后来一想可能跟他的共同话题太少,而他又是那种掉进电脑的人,所以自然他也就难以注意到我。于是,我就想到我要去学编程多少有共同话题来,后来我也买了那本“天书”——《Linux就该这么学》,其实真正踏实下来读懂了就会发现并不难。

我就是那种想到就去做的人,于是我也买了本计算机二级的书。实话实说,这就是最早学习的有关的计算机技术,我还是非常担心的,因为毕竟从小到大,我对电脑最大的应用就是看电视剧和上网聊天。之后又陆陆续续入迷似的看了其他一些书,当然也顺利靠下了计算机二级。我发现其实想要学习计算机技术并不是很难的。因为从书理论到实际操作过程当中,都有莫名的实践的乐趣。

在之后有接触了一些编程,我也学着开发一个小网站,这才接触到的服务器和linux系统。我学做网站并不是为了学习而去学习,我是一些美观大方的个人博客吸引住了,毕竟那么漂亮的一个网站我也想有几个啊。从基础的html到后端的php,再到支持php的apache服务器都有所接触。尽管后来有次大课的时候,我正看着之前认为是“天书”的书,然后旁边的当时还不是男友的那位白衬衫同学看到,也是一脸疑惑问道:“你个小姑娘怎么就学起这些来了。”我当时也没好意思说还不是为了你。不过共同话题多了些,一来二去就熟识了,经常在一起争论vim还是nano好用,php和java那个更好用,吵着吵着在一起了。谁主动我都忘了诶。虽然最初的目的不纯,为了跟技术宅有点话题,不过这个坑我跳进去就没跳出来,真的蛮有意思的。总之大学之后的两年时间课余时间基本都是和男友一起看书学习。再后来学习linux系统运维时候看到了刘遄老师的书。拿了奖学金之后和男友一起报班学习刘遄老师的课程。报班学习之后是比之前学习得更加系统。当然之后也和男友有着更多的讨论话题。我们也常常会因为问题争吵闹矛盾赌气又和好,而在这样的一个过程当中,我和男友的感情也升温了不少。

去年毕业后,通过校招男友在一家网络公司从事运维开发的工作,而我因为专业是金融,再加上因为学会了linux这门技术,也很顺利在一个互联网金融公司从事系统维护。因为我们工作的起点较高,所以在一线城市活下去还算体面,年前的奖金和年后的加薪让我们对未来有了不少信心。

至于当年挑坑的那段缘分嘛,早就水到渠成了,一直没领证是他年龄不够,一切都是缘分,不过也很推荐你看看《Linux就该这么学》这本书内容精炼,重点突出,也祝你与Linux结缘,遇到你喜欢和你爱的人。


本文出自 “12629896” 博客,请务必保留此出处http://12639896.blog.51cto.com/12629896/1913576

以上是关于技术宅小伙:计算机新手学习系列之LeetCode!的主要内容,如果未能解决你的问题,请参考以下文章

技术宅小伙:测试ChatGPT进行中文编程的能力

技术宅小伙:深入分析MyCircle中如何通过 MVCC机制来保证隔离性

技术宅小伙:关于前端的那些你不知道的事

技术宅学习Linux系统还是很有前途的

技术宅学习Linux系统还是很有前途的

技术宅学习Linux系统还是很有前途的