关于如何学习

来源:6-11 删除二分搜索树的最大元素和最小元素

慕妹2978617

2020-03-15

老师你好,我算是非科班培训来的,一直想学好算法,计算机,网络的基础知识。尤其是算法,其实听了老师的课我都能听的懂,老师也讲的很好。但是我在学习的过程中总是不能举一反三。比如 我听了第六章结束,想去leetcode上想刷一些简单的二叉树的算法,基本10个有9个不会,但是我课程的内容真的跟着敲了也很明白。比如这一题:
图片描述图片描述
图片描述
我做的时候已经想到了老师讲非递归遍历的时候用到了Stack,一定可以用这个逻辑来弄,写出来不对,断点调试,用笔画,方法栈给我绕的迷迷糊糊的,也没发现哪里不对,选择看看人家是怎么思考的,看到上面2个怎么也不明白,考过来调试,跟走跟着画还是不懂,明知道这个算法就是从根节点一直找到最末端的叶子节点然后就是不会写,也看不懂别人的。又搞不懂 这个后序遍历和前序遍历啥区别。为啥我用stack+前序就不行。哎真的很沮丧,3-4个小时过去了 还是没搞懂,明明看了老师的评论,说坚持学习哪怕学会了10%也是收获的,但是我真的觉得是不是自己笨明明刚过25觉得脑子也不够用,自信心和积极性也没了。是不是我学习方法不对,买了老师2个课程真的想好好学好算法,我是不是应该学完视频再找本书?现在leetcode不会的不要纠结,看完视频在看书再回头取解决?是不是学习方法不对呢?
老师先帮我看下这个题,然后能大致告诉我改怎么学习吗

写回答

1回答

liuyubobobo

2020-03-17

首先,对于你现在的水平,我的建议是:先不要做 Leetcode。


Leetcode 属于对算法和数据结构的运用。对算法和数据结构的运用,和实现底层的算法和数据结构,是两回事儿。大多数人都可以很轻松地实现出一个栈,但是,面对一个关于栈的问题,很多人并不能灵活地运用栈将其解决。实现一个栈,和用栈解决一个问题,完全是两回事儿。


对于这个课程来说,主要关注的经典数据结构的底层实现,而不是这些数据结构的灵活运用。实际上,科班学生也是这么学习的。学习这些经典的数据结构和算法,是大二的事情,而学习算法的设计和运用,是大三的事情。


所以,我的建议是,对于这个课程,首先,如你所说,看懂课程的内容。


其次,能自己实现出课程的内容。


这里所谓的自己实现,不是跟着视频敲代码,而是要能做到,不看视频,就去想,比如 BST 的增,山,改,查,各项操作,背后的原理是什么?逻辑是什么?然后自己能不能根据自己理解的原理和逻辑,将代码实现“凭空”实现出来?


注意,这不是背代码。而是能够根据自己理解的原理和逻辑,写出代码。写出的代码,自己想办法测试(课程中提供了很多简单的测试方式)。测试出来代码不正确,也很正常,自己 debug。实在 debug 不出来,再回头看一遍视频或者课程提供的代码,看自己的代码到底哪里有问题?


然后,最关键的,总结:自己的代码为什么会出现这个问题?是原理理解不清楚?还是实现有问题?实现过程为什么会犯这个问题?自己 debug 又为什么 debug 不出来?


这步总结至关重要,进步就发生在这个过程中。为此,我专门写过一篇文章,叫《万能学习法》:https://mp.weixin.qq.com/s?__biz=MzU4NTIxODYwMQ==&mid=2247484417&idx=1&sn=f774306b0ea726d979eba0c13b75496f&chksm=fd8cab47cafb2251f7bebcc3c540d0216989499ed9ad0cf0f3bd8817412ea79ea6b31cc66a8d&token=189389173&lang=zh_CN#rd 


如果对于这个课程所介绍的所有数据结构,你都能做到理解其中的原理和逻辑,并能够根据自己的理解,把代码写出来,你就已经达到这个课程的学习目的了。


通常,在这个过程中,逻辑思维能力会大大加强,再接触更复杂的算法设计问题时,也会更得心应手。


==========


说回你的代码。我不确定你是怎么 debug 的。但是,所谓的 debug,就是一步一步的看程序,再看每一步程序的时候,你必须要有预估,你必须明白,你期望的逻辑中,每一个变量的值是多少?但实际的值是多少?如果有出入,仔细研究,为什么会产生这个出入。


所以,最终 depth 的结果不正确,肯定是在某一步,没有得到你期望的结果。


比如如果你的程序 depth 最后的返回值是 2,但正确结果是 3 的话,那么肯定,在程序的某一步,按照你的思考,depth 应该是 3,可结果却是 2。


你必须找到这一步,然后思考:为什么在这里,我明明认为结果应该是 3,可是程序执行的结果是 2?


通常在这个时候,你就会意识到自己算法设计上的问题。


如果不知道怎么解决这个问题。再去看别人的程序,尤其是和你的思路一致的程序。然后单步跟踪,看到处理同样的一个节点的地方,别人正确的程序,为什么就能计算出这个正确的 3?


debug 的过程,不仅仅是看程序执行的过程,你的脑子里也应该有一个你以为的程序逻辑在执行。这个程序逻辑,在不停地和实际的程序逻辑作比较。直到出现你以为的逻辑和实际的逻辑发生冲突的那一刻。


==========


最后,我看到你做的 Leetcode 这个问题,本身就是 Leetcode 上《剑指 Offer》这本书上的问题。


如果你一定想攻克这些问题,买一下这本书,看看书中的讲解对你是否有启发,没毛病。


不过我还是要强调,这已经进入了算法设计的领域,而不完全是学习经典的算法和数据结构的底层实现了。实际上是更进一步的学习和练习。


加油!:)

2
0

玩转数据结构

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

6221 学习 · 1704 问题

查看课程