学了bobo老师的数据结构部分章节,leetcode题该如何刷

来源:5-7 更多和链表相关的问题

SunsunDay

2018-11-29

bobo老师您好,其实我想问的问题比较多,题目是其中一个。下面我详细给您列一下,希望您可以帮助到我。

交代一下困惑的背景吧:
比如我目前学完了您前5章(链表和递归)的内容,然后我就去刷了三四天的leetcode去巩固自己学到的数据结构的思想及,然后昨天回顾了自己前几天的经过和收获。我发现三四天内我只是把leetcode上关于array的题目从ac率从高到低过了大概30道左右。
收获是:感觉简单树立了信息,虽然是最单的题目,但是90%都是自己想出来的,即便很多不是最优解。- - 。但是同时自己也感觉这样刷题问题很多。题目太多自己肯定没有那么多时间刷完,如果一味的按最简单的来肯定不行。但是自己也抓不住不同tag的重点,经典题是那些。
然后这个时候跑看到了网上别人关于刷leetcode的建议什么的,但是大家说法不一致。所以这里产生了第一个问题:

问题一:
我该如何如leetcode刷题,学完每一章的数据结构去leetcode刷对应tag的题吗?
如果是这样的话,我发现在刷array的题的时候,遇到了很多题的最优解的话需要用到分而治之或其他算法思想来解该array类的题目。那是不是意味着我应该先广度优先了解一些数据结构和算法的思想再去刷这些题?但自己顾虑学了后面的数据结构前面的有些会忘,且学了某个数据结构后不能快速及时的得到训练。

问题二:
如背景交代,我不太清楚专项练习刷每个tag的时候,我应该做到什么程度就收手?然后去刷下一个tag(栈,队列,递归,链表,递归等),
总会犯您说的完美主义的错,要收手的时候,每次都想点开一题看是否自己真的掌握了会了所有关于array的题。当然我也知道不可能,自己秋招的失败就是犯在了完美主义上。

问题三:
在刷了array的30题左右后发现,在做下一道ac率一样的题的时候可能仍然要思考最多半小时甚至很久想出解法并总共花1个小时才能做出来。感觉很有挫败感,做了30题感觉自己没有长进。是我学习过程,刷题过程哪里出了问题了吗?
我感觉是缺少总结,自己今天下午准备开始好好总结前30道array题的切题点。解题思路等。进而引申出问题四

问题四:
在刷题过程进行总结的时候,因该总结些什么内容?
比如我刷了array的30题,那么我该总结一些array题的切题点?还有解题思路这样吗?

问题五:
大家网上都在安利剑指Offer,我还没有做过,不太清楚剑指Offer的题型分布,我什么时候去刷呢?是把您的视频看到哪里就可以去刷 - - ,提前需要做一些leetcode的题吗?
网上很多人都在说直接先去刷剑指offer,然后再做leetcode。

问题六:
问了网上很多人后,他们说目前只要刷了leetcode前250道,并且剑指Offer刷了2遍以上明年拿大厂春招也没问题。不知道我应该可以这样埋头践行吗?

最后:
非常希望得到您的耐心解答!多谢bobo老师,祝您生活愉快 ~

图片描述

写回答

1回答

liuyubobobo

2018-11-29

首先,对于这个课程的学习,我不是特别建议一边学习一边刷Leetcode,这是因为,这个课程的学习,是以经典数据结构的实现为主的。而Leetcode上的问题,如果涉及数据结构的话,是以数据结构的应用为主的。数据结构的底层实现和数据结构的应用完全是两回事儿。比如栈这个结构,是极其简单的,就是后进先出而已。但是在具体的应用中如何使用栈,是极其灵活的。如果你看Leetcode上Stack相关的难题(https://leetcode.com/tag/stack/),会有很大一部分是关于“表达式求值”的,这其实是一个经典算法,通常在编译原理中会介绍,称为Shunting-Yard算法。如果只是学过stack,然后自己就能想出这个算法,其实是不现实的。还需要进一步学习这个算法,接触这个算法,才能真正掌握这个算法。其实,这也是我们学习数据结构的目的——为了能够更好地学习计算机领域的其他算法。如果不知道什么是栈,是不可能理解Shunting-Yard算法的:)


所以,这个课程,是以学习数据结构的底层原理为主的,换句话说,通过这个课程的学习,你能理解大部分底层数据结构的原理,对于重点数据结构(如动态数组,链表,栈,队列,二分搜索树,堆),能够做到自己从底层进行实现,就已经完全达到这个课程的学习目的了。实际上,这部分内容本身,也是面试的一个重点,如:Java中ArrayList的原理是什么?红黑树是怎么回事儿?快排的原理是什么?哈希表是怎么回事儿?等等。这些,都和Leetcode关系不大:)同理,我的《算法与数据结构》课程(https://coding.imooc.com/class/71.html),也是这个定位,只不过包含一些算法内容(排序,图论算法等)。


对于Leetcode上的问题,我的建议是在这个课程和《算法与数据结构》两个课程的基础算法和数据结构已经掌握的基础上,再去刷。否则,就算做了一些题,但是如果连一些基本的算法和数据结构还没有掌握,实在不能叫有基础:)

这里要注意,我的这两个课程中包含一些高级内容,以面试为目的的话,这两个课程中的线段树,Trie,并查集,索引堆,可以先不学习:)


具体刷Leetcode,我当然会建议以我的《玩转算法面试》(https://coding.imooc.com/class/82.html)课程为纲进行刷题。很抱歉,我没有看过《剑指Offer》,但听说其中很多问题就是Leetcode上的问题,所以我觉得应该是没问题的。这个过程,主要是建立对一些基础的算法思想的认识。比如很多所谓的“数组”中的题目,其实和“动态数组”一点关系都没有,而可能是双指针算法,或者是排序,或者其实需要使用哈希表等等。这些内容,如果自己慢慢总结,太慢了,看我的课程,或者《剑指Offer》,快速熟悉一些常见的算法思路,还是很有意义的:)


具体Leetcode上的问题,以应付面试为目的的话,我认为完全没必要碰Hard的问题,同时,可以把焦点放在400号问题之内。因为Leetcode题号大的问题,都是后来Leetcode搞每周竞赛慢慢加上去的。前面的题目相对经典一些。


至于你说的“做下一道ac率一样的题的时候可能仍然要思考最多半小时甚至很久想出解法并总共花1个小时才能做出来”,我觉得你自己关键还是要分析,到底为什么用了这么长时间。是因为这个算法思想根本没接触过?还是编程调试过程比较慢?还是其实了解这个算法思想,运用不熟练?

如果算法思想根本没接触过,总结是没有意义,见一个学一个。

编程调试过程比较慢,总结也是没意义的,多编,没有捷径。

如果了解这个算法思想,运用不熟练,可以稍作一下总结,之前见过的同样的算法思路,拿来好好对比一下:)

这个问题背后涉及学习方法了。其实,学习方法没有定式,每个人必须要寻找适合自己的学习方法。整体,推荐你看一下我的这篇公号文章:https://mp.weixin.qq.com/s?__biz=MzU4NTIxODYwMQ==&mid=2247483836&idx=1&sn=90854aa76507281403e4dd9cd434a12b&chksm=fd8caefacafb27ec78f999fde4f1217c04c6e2ff28cf51fe511d8fa29d484d9281ff91de8c9c&mpshare=1&scene=1&srcid=1129Lc5eLidIW6D8VoKA8Pu4&pass_ticket=RV9qWCQgTyPGHQdgs1SiOhOosKSl5aQPVIIhf5rmqgutcztN9UJySUpu5R0dVEIS#rd 


但是,就像我前面说的,拿出Leetcode上标签是array的30个问题去总结,可能是不可取的。因为都是array的问题,他们背后的算法思想很有可能是完全不同的,使用array去分类是不科学的。这也是我建议你看我的《玩转算法面试》或者《剑指Offer》的原因,整体分类应该是更合理的:)


最后,“目前只要刷了leetcode前250道,并且剑指Offer刷了2遍以上明年拿大厂春招也没问题。”这个说法基本靠谱,因为我个人认为这个量是够了的。当然,能不能拿到大厂春招offer,还有很多运气因素,包括当下经济形势等等因素。但是达到这个量,我认为在算法这个领域,从面试的角度看,已经够了:)


不过,一定要明白,面试不仅仅是算法,切记:)


加油!:)

5
2
SunsunDay
非常感谢bobo老师的耐心解答。非常感谢!我大概清楚了!
2018-11-29
共2条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程