怎么刷算法,leetcode上有哪些经典题目?

本科搞过三年 ACM,拿过金银牌的学长来说下吧!

题主这其实是问了两个问题:

怎么刷算法题LeetCode 上有哪些经典题目

其实笼统的来讲,刷题是“每学习一个专题(数据结构或算法),就去刷对应专题的题目去巩固你学的专题的内容”。

这个其实是我一直在说的:边理论 + 边实践!

下面我来详细的讲一下题主的两个问题,都是超级干货,大家记得帮我 @Rocky0429 点赞呀~

一、怎么刷算法题

随着刷题的深入,我发现刷题其实就是分为两步:

第一步有思路,即知道用哪种姿势怎么解题。第二步是实现,即将你的思路转化为代码。

接下来我所有的废话都是围绕这两步来展开。

0x01 有思路

先说第一步:有思路。

算法题刷多了,你就会发现,最后其实在你脑子里记住的不是实现这道题的代码,而是解这道题的思路。

当我们刷了几百道几千道算法题的时候,你不可能记住每道题的代码,但是你可能知道这道题的思路,也就是出现类似“这道题我见过,我知道用这样那样的方法可以做出来”。有了思路,其实把它实现出来就是自然而然的事儿了,当然可能有人说知道了思路也不知道怎么实现,现在我先不说,这是我们下一步要讲的问题。

上面说的是我们要走到的目的地,那如何走上这条路,从而到刷题刷到思路“泉涌”呢?其实很简单,我们从小到大一直在被动习惯的四个字:题海战术

题海战术,说白了就是多刷题,见多才能识广。

但这里的多刷题,不是指多瞎刷题,而是有方法的去刷。至于刷题的网站我已经在文章的开头放链接了,不知道去哪找题的可以看一下。

首先说什么是瞎刷题,就是看到一道刷一道,这是很多刚开始刷题的同学容易犯的毛病。

有的追求数量,刷了一堆简单题,沉迷在 AC 的快感中不能自拔,在深深的自我感动中依然菜的扣脚;

有的追求无脑,看到一道题就去网上搜答案,以为会解决问题,实则搜到了还看不懂,正好一劳永逸,给自己下了不是这块料的断言,成功的做到了开始即结束。

别问我为什么知道,我才不会告诉你当年我就是这样…

其实怎么用正确的题海战术,在我看来,其实也还是两步,第一步多题一解,第二步一题多解。

当然在此之前,我觉得你得先搞明白什么是时间复杂度和空间复杂度,不然不懂这些指标,你也不知道算法对于你当前题目的优劣。之前写过一篇旧文,有兴趣的可以看一下。

保姆级教学!彻底学会时间复杂度和空间复杂度​mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=2475918746&idx=1&sn=3fe42234a1f07fb084d11fe06fb24893&chksm=ff22e217c8556b019b9052f9d4805174385ba4c8c099216fa226dbd1b033a9a49782579e4b75&token=1996171232&lang=zh_CN#rd

【0x01-1 多题一解】

多题一解,就是把多种同类型的题先放在一起来做,也就是俗称的刷专题。下面是我当年刷题的一部分分类的截图:

很多大佬说做题要追求完美,一道题来 N 种姿势,但是对于刚开始起步的同学来说,一道题带着多解的思想包袱去刷,本身就是一种负担。你很难指望初学者能一上来就一题多解,没那么多见识,脑阔里没储备那么多的算法类型,能够暴力破解且跑通就已经是烧高香了。

这里再多提一嘴,关于网上搜答案这件事,答案可以搜,但是不要上来一看题,感觉自己不会就立马搜答案,要尝试思考,多在草稿纸上写写画画,实在想不出来再去搜。

搜到的答案我不希望你去看别人的代码,按照别人的代码一步步的写出来其实本身没有多大意义,真正有意义的是别人的思路,通过别人的思路来自己实现出现,这才是最应该做的。

这样做的好处是,你可以很快了解一种类型题目的做题方法,加深对某类算法的理解,总结出做题的套路,这算是一种抽象的概括能力。很多时候你就会发现,题目不过是在某类解决办法方面做加法减法

刷题按照分类来刷,如果不知道刷哪几道题,可以看下这个前字节大佬的刷题笔记:

两个月斩获 70k star,前字节大神刷题笔记​mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=328435156&idx=1&sn=f189d0ab3a5faa4e224b6e3f2b485be1&chksm=7f22e25948556b4f0fad0ec8f42dabc17abaf8b097421861acf92516dcde1582525ee1b4dbbb#rd​mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=328435156&idx=1&sn=f189d0ab3a5faa4e224b6e3f2b485be1&chksm=7f22e25948556b4f0fad0ec8f42dabc17abaf8b097421861acf92516dcde1582525ee1b4dbbb#rd

【0x01-2 一题多解】

其实这个不用刻意去追求一题多解的能力,刷的专题多了,碰到的题目多了,自然而然你碰到一道题的时候脑袋里就会有想法,觉的可以这样做,也可以那样做,这个时候你就可以对比不同的时间复杂度和空间复杂度,选择当前的最优解法

说一题多解,其实就是希望你在碰到一个问题的时候能够多想一步,一步一步再一步,不同维度不同姿势都尝试一下。刚开始这可能比较难,毕竟这涉及到一个改变,因为人都是有惰性的,毕竟只求一解比自找麻烦的求多解舒服多了…

题目见的多了你就会发现,很多时候你会碰到这种情况:A 题你有 5 种方法去解决它,改变它的某一个条件变成 B 题,作为 A 题的相似题 B,可能这个时候你照搬 A 的解法来解决 B,你只剩下 3 种或者更少的解法可以解决 B 题,如果你只会 1 种解法,刚好这种解法失效,那你就只能再另想它法。

所以一题多解的好处也是显而易见的,就相当于你的手里多了很多的选项,选项多了不管你在面试或是其它时候,都能手里有牌可打。

在这里我又要多提一嘴,追求一题多解并不意味着“不择手段”的追求题解数量的堆叠,也就是不要过分追求所谓奇淫技巧的解法,而这恰恰是许多同学容易犯的毛病,错误的认为了奇淫技巧等于水平高超,在我看来这个除了能引来别人一句卧槽的惊讶,从而带来一点内心虚荣心的满足以外,其余的用处不大,看个热闹就得了。毕竟鲁迅先生曾经说过:“Use your best judgement”。

当然我也不是全盘否定技巧,但是你连个两三百道题都没刷完,你就在这给我讲你要技巧,我会认为你是在耍流氓…

0x02 实现

一道题有了思路,其实这道题的 90% 你已经解决了,把它实现出来按理来说就是自然而然的事儿了。

当然可能有同学知道了思路,但是就卡在这 10% 不知道怎么实现上,那这就是你写代码的能力问题,其实一样的,这就是不熟练,不熟练的原因就是练少了。

其实这个问题的唯一解还是所谓的“题海战术”,多练习,唯手熟尔。

刚开始的时候不管是书上的例题,一些简单的水题或者你想实现的一个简单的东西,按照你的想法写出来或者看一遍别人怎么写的,自己再一步一步的默敲,不要怕麻烦,一定要自己动手,不要看会了,我们都知道看会了其实不是真正的会。但是慢慢当你习惯了这种方式,你的代码能力会潜移默化的变强。

别问我为什么知道,我难道要说作为一个当年上了大学半年还没写过一次超过 20 行的代码的男人,经过一个寒假以后,能切百十行代码的题?

也太丢面儿了吧,说好的整个学霸人设呢…

0x03 第三步

咦?不是只有两步嘛,哪来的第三步?

嘿嘿,总得给能坚持看我说废话看到这里的同学开个小小灶不是…

其实还有两点是我想说的,而且这两点是我觉得在整个过程中最重要的。

【0x03-1 做总结】

怎么说呢,做总结这件事的好处,谁做谁知道,不信你就试试…

每道题有每道题的总结,每种类型的题有某类题的总结,千万不要怕麻烦,虽然刚开始的时候确实会很麻烦…

每每回想起来,我最后悔的就是在我刚开始刷题的时候没有做总结。当年集训队老师告诉我们每道题做完都要把题解发布到 CSDN 上,记录自己的思路,解题方式和代码。这件事乍一听我觉得太麻烦,觉得“有这个时间我多刷道题它不香嘛”,一直当作耳旁风。

后来真正开始在 CSDN 上发题解,并不是我突然顿悟,而是集训队老师看我们太懒,强制执行,然而这个强制,在经过初期的不适以后,慢慢的让我形成了做什么都要总结记录的习惯,一下子就写了 6 年。下面是刚开始的一些截图:

习惯性梳理总结,在这个过程中重新产生更多的认识,理解更深,有更多的想法,无论后来成为 CSDN 的博客专家(Rocky0429)或者后来开始写公众号(Python空间,id:Devtogether),都是因为这种积累,我因此而获益,对我们老师感激一生。

【0x03-2 保持热情】

保持热情,不仅仅是能坚持,而要在坚持上最好能带有一点兴趣。刷题真的是一个很漫长的过程,如何在这个过程中能坚持下去真的很难做到…

我觉得你最好有一个最终的目标,这个很多开始刷题的同学肯定都有,不然没人闲着没事找事去刷题,有了最终的目标朝着这个方向去努力,同时把这个过程分成一部分一部分,比如拿刷专题来说,我这段时间刷链表,下段时间刷贪心,再下段时间刷 dp…

将目标量化为可衡量的每一段,自己有了掌控感,一步一步的向着最终的目标前进,知道自己离着还有多远,不至于半途而废。

拿我自己来说,当年搞 ACM,半年以后我已经准备放弃了,那段时间完全迷茫,觉得自己水平很差,没有机会去参加比赛,不可能拿到奖牌。那段时间我开始去寻找别的出路,去参加 Python 的社团,准备转去做项目。

浑浑噩噩了一圈,最后还是回去做 ACM,一方面是不想让自己半年的努力付诸东流,对拿牌子的执念,更多的是我发现坐在那写项目和做题比起来,我更喜欢 AC 的快感。

二、LeetCode 上的经典题目

LeetCode 上面有 1k+ 的题目,没有必要都刷完。

每个专题选一些有代表性的题目去刷,去理解去吃透。

其实刷题这件事,就是按照专题来刷就好,数据结构与算法的重要且常考的内容就那么多:

数据结构就是:数组、链表、栈、队列、散列表、堆、树、图等。

算法就是:回溯算法、分治算法、枚举算法、贪心算法、动态规划、查找、匹配、排序等。

针对 LeetCode,题的解法有很多,我们往往追求的是最优解,这里有一份清华学长整理的 LeetCode 最优解,强烈推荐:

清华学霸的刷题笔记(leetcode最优解)​mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=328435125&idx=1&sn=3de887a586e8a6a08784036de466623e&chksm=7f22e23848556b2e67fedbd30b1ca0fcdb46ed336279aa4cb0899a0f2ff44210e829d125ade6#rd

关于 LeetCode 的刷题顺序,我做了整理,大家可以跟着走。

这份清单我会一直更新,同样也会一步步的把每个知识点的入门讲解和每道题的题解用“图解”的方式分享给大家。

站在初学者的角度,用最直白的方式和最易懂的代码,最大可能摒除不同编程语言的带来的干扰,理论 + 实战,带你彻底搞定数据结构与算法。

Rocky0429:算法小白的 LeetCode 刷题顺序(持续更新2021/12/12)

复杂度

精讲:

保姆级教学!彻底学会时间复杂度和空间复杂度​mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=2475918746&idx=1&sn=3fe42234a1f07fb084d11fe06fb24893&chksm=ff22e217c8556b019b9052f9d4805174385ba4c8c099216fa226dbd1b033a9a49782579e4b75&token=1996171232&lang=zh_CN#rd

数据结构

【数组】

精讲:

蛋蛋惨遭数组滑铁卢,面试官建议回村养猪。​mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=2475918890&idx=1&sn=b5dbd85bbe358d7b1668e2d9c27e2122&chksm=ff22e1a7c85568b122279e836dec029dcc9b6a8049cf84c659ccff6f69eb29e6187912b1de66&token=1996171232&lang=zh_CN#rd

LeetCode27 移除元素:ACM 选手图解 LeetCode 移除元素

LeetCode59 螺旋矩阵Ⅱ:ACM 选手图解 LeetCode 模拟法解决螺旋矩阵Ⅱ

LeetCode209 长度最小的子数组:ACM 选手玩转 LeetCode 滑动窗口解决长度最小的子数组

LeetCode977 有序数组的平方:ACM 选手图解 LeetCode 有序数组的平方

【链表】

精讲:

链表,画几下就整明白了!​mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=2475918898&idx=1&sn=e5c7bf9c43dd205082f77beead41a187&chksm=ff22e1bfc85568a945b3e4569ea727148e6e736ccce15ec12d77c2f8ae7b8acb2eabf900e3a6&token=1996171232&lang=zh_CN#rd

LeetCode19 删除链表的倒数第 N 个节点

LeetCode24 交换链表:交换吧,链表!

LeetCode25 K 个一组翻转链表

LeetCode141 环形链表:链表,你有环嘛?

LeetCode142 环形链表Ⅱ:有环链表,你的入口在哪?

LeetCode160 相交链表:对不起,相交链表,我做的有点不浪漫。

LeetCode206 反转链表:反转吧,链表!

LeetCode707 设计链表:稳了,一题学会链表的 5 种操作!

【栈和队列】

精讲:

呔!“栈”住,队列!​mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=2475919772&idx=1&sn=8574188f72d892d501f15956b6a2a629&chksm=ff22ee11c8556707dd6d5af977125ce6698ebbcfaa3b9083e14c3658d2975761079a9c2082a4&token=1996171232&lang=zh_CN#rd

LeetCode20 有效的括号:栈,你告诉我这个括号配不配!

LeetCode150 逆波兰表达式求值:栈,求求这个逆波兰表达式的值!

LeetCode225 用队列实现栈:咋又要用队列实现栈了嘛?!

LeetCode232 用栈实现队列:用栈实现队列怎么样?

LeetCode239 滑动窗口最大值:队列,帮我搞一下这个滑动窗口最大值。

LeetCode703 数据流中的第 k 大元素

LeetCode1047 删除字符串中的所有相邻重复项:栈,你给我玩这个字符消消乐!

【字符串】

精讲:

关于字符串,你知道这些么?​mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=2475920930&idx=1&sn=3a1e374f9515afbe99ec2264491f725e&chksm=ff22e9afc85560b90dfea7e049024055b6ecf3922b72f2ddc8625e79e07c2045714bbc362c3e&token=1635518900&lang=zh_CN#rd

剑指 offer05 替换空格:字符串,把这个碍眼的空格给我换掉!

剑指offer58-Ⅱ 左旋转字符串:字符串,你朝左给我旋儿一个!

LeetCode151 翻转字符串里的单词:枯了,怎么又和翻转字符串杠上了…

LeetCode344 反转字符串:反转字符串不是关键,重要的是我想说…

LeetCode541 反转字符串Ⅱ:这次反转的字符串,不简单。

【哈希表】

精讲:

ACM 选手带你玩转哈希表!​mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=2475921482&idx=1&sn=a0010596ea33c8605ed02b941cdfe854&chksm=ff22f7c7c8557ed1383751061be7d701e026a75ad0e22199356c826c05efcde955d99cccc4d5&token=1934610078&lang=zh_CN#rd

LeetCode1 两数之和:LeetCode 选手图解 LeetCode 之高效哈希求解两数之和。

LeetCode15 三数之和:ACM 选手图解 LeetCode 超高频面试题三数之和

LeetCode49 字母异位词分组

LeetCode 202 快乐数:ACM 选手图解 LeetCode 快乐数。

LeetCode242 有效的字母异位词:ACM 选手图解力扣之有效的字母异位词!

LeetCode349 两个数组的交集:ACM 选手图解 LeetCode 之两个数组的交集

LeetCode383 赎金信:ACM 选手图解 LeetCode 之赎金信。

LeetCode454 四数相加Ⅱ:ACM 选手图解 LeetCode 四数相加Ⅱ

二叉树

LeetCode 94 二叉树的中序遍历

LeetCode101 对称二叉树

LeetCode102 二叉树的层序遍历

LeetCode 104 二叉树的最大深度

LeetCode 105 从前序与中序遍历序列构造二叉树

LeetCode 114. 二叉树展开为链表

LeetCode236 二叉树的最近公共祖先

LeetCode 543 二叉树的直径

【二叉搜索树】

LeetCode96 不同的二叉搜索树

LeetCode98 验证二叉搜索树

LeetCode235 二叉搜索树的最近公共祖先

算法

【递归 & 分治 & 回溯】

LeetCode 17 电话号码的字母组合

LeetCode 22 括号生成

LeetCode 39 组合总和

LeetCode 46 全排列

LeetCode 78 子集

LeetCode 79 单词搜索

LeetCode 226 翻转二叉树

【贪心算法】

LeetCode 11. 盛最多水的容器

LeetCode 55. 跳跃游戏

LeetCode 122. 买卖股票的最佳时机 II

LeetCode 309. 最佳买卖股票时机含冷冻期

LeetCode 406. 根据身高重建队列

LeetCode 714. 买卖股票的最佳时机含手续费

【深度优先 & 广度优先】

LeetCode22 括号生成

LeetCode36 有效的数独

LeetCode37 解数独

LeetCode51 N皇后

LeetCode52 N皇后Ⅱ

LeetCode102 二叉树的层次遍历

LeetCode104 二叉树的最大深度

LeetCode 111 二叉树的最小深度

【二分查找】

精讲:

ACM 选手带你玩转二分查找!​mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=2475922852&idx=1&sn=f6990bcafef36c96599866ab99bb25f2&chksm=ff22f229c8557b3fab35b99c29038eb4ea0c024010128eb09e8923922666e16e3928b1ed4edf&token=1145569493&lang=zh_CN#rd

LeetCode33 搜索旋转排序数组:ACM 选手图解 LeetCode 搜索旋转排序数组

LeetCode34 在排序数组中查找元素的第一个和最后一个位置:ACM 选手图解 LeetCode 查找元素在排序数组的区间位置

leetCode35 搜索插入的位置:ACM 选手图解 LeetCode 搜索插入位置

LeetCode69 实现 int sqrt(int x) 函数:ACM 选手图解 LeetCode 算术平方根

LeetCode74 二位数组中的二分查找

LeetCode81 搜索旋转排序数组 Ⅱ:ACM 选手图解 LeetCode 搜索旋转排序数组Ⅱ

LeetCode153 寻找旋转数组中的最小值:ACM 选手图解 LeetCode 寻找旋转排序数组中的最小值

【字典树】

LeetCode79 单词搜索

LeetCode208 实现 Trie(前缀树)

LeetCode212 单词搜索Ⅱ

【位运算】

LeetCode52 N皇后Ⅱ

LeetCode191 位1的个数

LeetCode231 2 的幂

LeetCode338 比特位计数

【动态规划】

LeetCode70 爬楼梯

LeetCode72 编辑距离

LeetCode120 三角形最小路径和

LeetCode121 买卖股票的最佳时机

LeetCode122 买卖股票的最佳时机Ⅱ

LeetCode123 买卖股票的最佳时机Ⅲ

LeetCode152 乘积最大子序列

LeetCode188 买卖股票的最佳时机 Ⅳ

LeetCode300 最长上升子序列

LeetCode309 买卖股票的最佳时机含冷冻期

LeetCode322 零钱兑换

LeetCode714 买卖股票的最佳时机含手续费

【并查集】

LeetCode200 岛屿的个数

LeetCode547 省份数量

不断完善ing,还是那句话,会慢慢的把图解 LeetCode 的题解都更新上来,这是个长期的过程。

希望对你有所帮助

我的一些个人经验,相信肯定能帮助到你。

希望数据结构与算法的学习不会成为你成功路上的绊脚石。

如果你刷 LeetCode 刷腻了,我这里还有很多私藏的平台哟。

Rocky0429:刷了几千道算法题,这些我私藏的网站都在这里了!

码字不易,如果觉得不错,大家记得帮我 @Rocky0429 点赞呀~~

来源:知乎 www.zhihu.com

作者:Rocky0429

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载

此问题还有 7 个回答,查看全部。
延伸阅读:
leetcode 算法常用技巧有哪些?

为什么我觉得leetcode算法题挺简单的,是错觉吗?

© 2023, 免責聲明:* 文章不代表本網立場,如有侵權,請盡快聯繫我們 info@uscommercenews.com * 讀者評論僅代表其個人意見,不代表本網立場。評論不可涉及非法、粗俗、猥褻、歧視,或令人反感的內容,本網有權刪除相關內容。.