人类解决问题的一般性的思维方法,总结起来主要有以下几种:
1.时刻不忘未知量。即时刻别忘记你到底想要求什么,问题是什么。(动态规划中问题状态的设定)
2.试错。对题目这里捅捅那里捣捣,用上所有的已知量,或使用所有你想到的操作手法,尝试着看看能不能得到有用的结论,能不能离答案近一步(回溯算法中走不通就回退)。
3.求解一个类似的题目。类似的题目也许有类似的结构,类似的性质,类似的解方案。通过考察或回忆一个类似的题目是如何解决的,也许就能够借用一些重要的点子,用特例启发思考。通过考虑一个合适的特例,可以方便我们快速寻找出一般问题的解。
4.反过来推导。对于许多题目而言,其要求的结论本身就隐藏了推论,不管这个推论是充分的还是必要的,都很可能对解题有帮助。
5.如果是大二大三、研一的同学,找工作还有很长一段时间,期间可以先打好编程的基础。先把C语言、数据结构学完之后再来刷题。
刷题过程中,新手可以按照不同标签分类、同一类型从简单到难的顺序刷题,效率更高。以下按照算法思想和数据结构分为两大类,每一类中有若干不同类型标签的题,按照从简单到难分类。
如何有效地写算法题
目的
持续做算法题的目的仍然是自身能力提升。可以继续细化成三点:
1.保持思维敏捷。非常重要,状态好才能保持对编程的热情。
2.对基础的数据结构、查找和排序保持熟练。能解决日常开发中的性能相关问题。
3.积累对问题域的探索。只有对问题域有足够的探索,才可能举一反三,迸发灵感。
方法
在刷题的过程中非常最容易产生挫败感,无法坚持。原因是,长时间的思考导致疲倦,多次积累的疲倦使得自己产生了 抵触记忆。以至于会下意识觉得做题就是 刻苦。如果每次做一件事最后留下的映像都是轻松愉快的,那么人就会越来越喜欢做此事,反之厌恶。所以为了能保持做题的兴趣,务必每次要主动给自己留下好的记忆。
目前 leetcode 上的题大致可分为几种类型:
对某种复杂规则的彻底解析,很有可能要构造状态机,充分考虑边界情况。 对某种数据结构及算法的应用。 对数学概念、遍历、动态规划等的综合应用。