Skip to main content

Command Palette

Search for a command to run...

Leetcode刷题总结

Updated
1 min read

1. 原因

为什么最近开始刷算法题呢?其实原因也比较简单的:

  • 我想去市场上看看,去感受一下真实的行情;最近几年整体环境的确很差,公司也在不断的裁员的;我本身倒对公司裁员没有太多的看法,毕竟都是为了活下去的,只要你按照法律要求给钱即可;
  • 刷题可能是面试中的门槛,过了这个门槛才能聊后面的事情,也是不得不的事情吧;

2. 我是如何刷题的

其实本身没有太多的经验,以前面试的时候我都是从第一个题目不断的往后刷,每次就没坚持多久就刷不动了;这次我改变了一下策略,我在极客时间上买了一个课,叫做"算法面试通关 40 讲" , 这不是广告,只不过自己刚好看到了就买了下来看看;和我之前的策略不一样的是,他分类来介绍不同的算法题,对类似的面试题会统一聊一下;我想想自己也没什么策略就先按照这么来做题;

3. 总结

因为才开始,所以后面会慢慢的补充自己在刷题过程中的经验的,所以慢慢会连载下去;

3.1 Array&List

数组优点在于访问速度快,缺点在于修改的性能比较差;List优点在于随机访问性能比较差,因为要遍历,好处是修改性能好,因为只需要关心节点前后的指针即可;

  1. 反转List

    这个题目我自己用了两种方式,一种是比较暴力的解法,一种是比较好的解法;暴力解法就是遍历List将每个node的地址保存在数组中,然后在反着遍历数组修改每一个节点的对应的next节点; 还有一种方式关键在于: 同时维持两个指针currentnext指针,每一次修改next指针指向current,不断的迭代来反转List

  2. 如何判断List有环

    这个题据说面试比较常见;也有两种解法,第一种就是用map来维持遍历过节点的信息,如果第二次遍历到同一个节点的时候能知道,好处简单坏处就是耗内存; 第二种解法其实比较诡异,叫做快慢指针法;原理是fast的指针一定会在某一个时刻和slow指针相遇,这样就能知道是否有环;其实我有一个优化的思路,就是快和慢指针在遍历的时候顺便给节点加上编号,当慢节点遍历到一个节点的时候发现当前节点有编号并且和自己不一样,必然就会有环,好处就是不用去判断相遇的问题了;

  3. 成对反转

    题目的意思List成对反转,不是整体反转;其实这个题目的难点在于成对反转涉及到了多少个节点; image-20230119170329615

    其实涉及到了3个节点,因为当紫色两个节点进行互换的时候其实会影响到白色节点的Next指针,所以你需要同时保持3个节点,然后进行替换;然后进行成对遍历;

  1. list是否有环2

    其实这个题目一开始我是真不知道如何做,相比于第二题,主要的难点在于需要知道哪个节点是环的起点;后面看了leetcode上面的一个人的解释的时候我突然就明白了, WilmerKrisp 这个用户的解释就非常的好;其实这是一个数学问题;里面有一幅图就非常好的解释这个问题,有兴趣的可以点击链接看一下;大概意思是: 假如slow节点与fast节点相遇的时候离起点的距离是X,那么fast行进的距离是2X; 那么从相遇节点开始一步一步进行,和从头开始一步一步行进的过程,这两个节点相遇的节点就是环的起点; WilmerKrisp画的图

  2. 按组进行反转List

    关于这题主要是反转那题的升级版本,主要注意的点在于按照组进行反转之后,这个组前面的那个节点的指针需要保存下来,用来变换一下它的next的节点;

3.2 Stack&Queue

关于Stack和Queue知识点有几个:

  • Stack: FILO
  • Queue: FIFO;
  • Priority Queue: 主要是大小堆;

1.用queue来实现stack

​ 比较简单的,queue可以用数组来模拟;

2.用stack来实现Queue

3.判断表达式是否有效

​ 是stack的一个应用,比较简单;

  1. stream 获得最大的K个数字

    本质上用小根堆的方式维护一个K大小的堆,如果出现比最小值要大的数据就进行替换+调整,这样遍历玩一遍的时候就可以获得正确的数据;不过我写的代码3次之后才被accept,原因在于heap的调整上面出现了错误;这个数据结构比想象中要难写一些;

  2. 输出滑动窗口中最大的数据

    这题目前我的accept的方案性能貌似还不是很好,还需要优化;解法目前我想到的有两种:

    1. 维护一个大根堆,在遍历的过程中不断的去剔除不在滑动窗口中的值;这个解法我最为纠结的其实是如何快速的从heap中把要剔除的数据剔除,后来看到有人解释就是创建索引,每一个下标在heap中的位置进行索引;这个的时间复杂度为O(n * logk)

    2. 另外一种方式比较需要思考一下;维持一个窗口,如果进来的数据比最大值要大,那就可以将这个数值前面的数据都剔除,原因是只要我在,你们这些比我来的找并且比较小的数据是没有机会输出的,所以就可以排掉;如果后面进来的数据比最大值要小,那么依然要保存;原因是最大值比这些数值来的早,可能后期会被淘汰,一旦淘汰这些数字不就有机会了;主要的点在于两个:

      1. 队列第一个位置就是当前最大值;
      2. 当最大值被剔除之后,通过不断的让队列的第一个位置的数据和插入的数据进行比较,如果比插入的数据要小的话就提出,从而维护第一条特征;

        最终这个算法的复杂度是O(N)

More from this blog

Ai时代的工具链

本周是black Friday,我订阅了几个AI服务,还是蛮贵的...不过这样基本上构成我目前整体的知识阅读的过程,随着Ai的不断发展,工具链的替换可能是很重要的一个过程的。我主要订购了以下几个工具: Memo: 这个工具的主要作用是将视频/audio转srt,并且带有ai翻译的工具;当然我觉得它做的非常好的是,它把整个链路做的非常好的,并且可以用本地的资源做audio->text;而且它自带了很多的ai功能,比如对字幕进行进一步的AI的处理,提问,summarize和思维导图等等;目前我主要...

Nov 30, 20251 min read

做了一个噩梦

今天凌晨4点多起来看了一眼丈母娘的发烧是否ok...就导致我有点睡不着的,刷了一会推特之后又开始睡觉了,于是就开始做了一个很可怕的梦。 噩梦 那天,我不知道是在哪里..我带着女儿和我弟出去玩的,貌似是一个风景山区。于是我就带着女儿和弟弟出去玩的;我们走啊走, 沿着一条路一直走..突然看到一个小道有一家饭店的,这个饭店是比较特殊,有很多海鲜的;我看上了一只大龙虾,我问多少钱的,他说大概就70rmb就可以的。。。我觉得很划算的,我心想:我买下来,到时候把老婆叫过来一起吃的,并且告诉她这个才70rmb...

Nov 24, 20251 min read

子女教育-2

下面我分享一个推特上的一个关于子女教育的推 哈哈哈哈,李诞这个视频我看过 我给你分享几个我和我女儿之间的小故事 第一个故事 我经常给小朋友说:你们现在上学的成绩不重要,你们现在数学考试都是语文脑筋急转弯,语文考试都是历史背诵,一点用都没有,你出了社会就知道,社会根本没有选择题,社会要有选择题就好了,最难的是你遇到困难,你连门都找不到。我第一次这样讲的时候是女儿小学4年级,那时候我女儿听的一愣一愣的,她不明白,但是觉得我的理论和学校的不一样,很狂妄,但是她很喜欢,哈哈哈哈。 她什么时候真正明...

Nov 13, 20251 min read

被诈骗-马来西亚

最近我在国内,我老婆在马来;最近在计划搬家的,找的那个房子不包含一些必要的家具,于是我老婆就必须要买点家具的,主要是沙发和餐桌..我们本来计划是说去ikea去买,但是我老婆觉得ikea的家具不便宜,并且款式一般的,最终问了中介找了一个二手平台找找看不错的家具。 我老婆挑了两个家具的,我看了一下价格也不算便宜的,但是我老婆喜欢的,于是我就说你觉得ok那就购买吧。我还顺便问了一下,这个家具能不能线下看一下货的,但是我老婆说这货在很远的地方的,大概是300公里的一个城市的。那我就说这个包邮吗,我老婆说...

Nov 13, 20251 min read

当下和最近想做的事情

1. Current 当下 最近依然还在中国,已经回来快一个月了. 最近一直在忙着带丈母娘看病和住院的。索性一切都还在可控范围内的,丈母娘由于糖尿病控制的很差导致本身的冠心病也复发. 这次去浙江省人民医院去做了造影检查和支架植入的手术的,不过这一切都比我预估的要顺利,我就怕她由于长时间没吃药和高血糖的持续的时间太长了,会带来严重的问题,不过好在没有发生最坏的事情的。 因为做了手术,所以这段时间我和我老婆的姐姐每人轮换的陪床,不过陪床真的好累的,因为睡得很不好的,特别的累。不过好在都结束了,而且丈...

Nov 9, 20251 min read

Keep Move - 永不止步

39 posts