算法思路总结
从解面试中的算法题目的方面来说,经常会遇到以下情况:
完全没有思路 连暴力解都不知道从何下手
知道可以用暴力解 但是更优解想不出来
知道大致的方向(比如需要用到什么算法 什么数据结构之类的)但是完全写出不来
所以总结一下 就是 算法了解的并不系统(东一脚西一脚 记不住 需要检索的时候没有方向) 还有就是不熟练
所以本文的主要方向是系统的整理一下解题思路,当然 这些思路不一定用于解算法题 对于生活中的一些事也是很有帮助。
首先说算法题目的思路分类,这分类实在太多了
比如说:用算法解/数据结构解,用遍历解/递归解, 用complete search解/Greedy解 等等等等。
如果分解一道题目的解答来看的话:代码由以下部分组成:
corner case + 初始化 + 核心代码
三者一样重要 任何一个出问题都解决不了问题。
我们先按照算法题目的分类来说:
算法解:这算法太多了 比如各种字符串算法,DP,greedy, binary search等等
数据结构解:这种如果做的多了 看到一个东西容易就知道用什么数据结构解,比如sum range的线段树和树状数组,queue/stack解决其他一些问题。而且还有最特殊的一类就是linkedlist,技巧特别多,比如奇偶复制,反向读取,环的判断,环的起始点,双连交替合并等等,这些技巧都是要常常refresh的,而且与linkedlist类似,树也是这样。Design的题目 也要求我们
因为算法的类型实在事太多了 所以我们先从数据结构说起 详细的遍历各种算法体重常用的数据结构。
(注意这里所说的数据结构是我们常用来解题的 不是常见的 所以没有包括linkedlist和树/图)
首先 array arraylist linkedlist自然不必多说
此外 常用的有:
FIFO/FILO(5): Queue, Deque, PQ, Heap, Stack (queue和stack都是使用linkedList实现 PQ有自己的实现方式)
Map/Set(2+2): HashMap/HashSet/TreeMap, TreeSet
特殊类型的树状数据结构(3):Trie, Segment Tree, Binary Index Tree
并查集(1):Union find
数了数一共十三种。
那么算法大致有哪些呢?
针对不同类型的问题有不同的算法:
字符串:各种字符串匹配算法
字符串/数组:双指针(单向双指针 双向双指针)排序 滑动窗口
树:pre/in/post/level order(本质也是BFS/DFS)以及其的各种变形用以满足要求,而且必须知道何时适合用递归
图:DFS/BFS(又可以细分成拓扑排序等等)
并不针对固定类型题目的算法: Backtracking, DP, Greedy, 排序,line sweep, reservoir sampling.
其中,我们可以把暴力解法,backtracking,DP with剪枝,DFS, BFS看作是complete search因为他们都是的出来所有的可能的结果然后选择合适的。其他的比如贪心算法就属于“投机取巧” 当然这还要看题目的具体要求 看题目是输出所有 还是输出1个(哪怕存在多个) 还是输出符合条件的n个
这部分太难总结了 因为实在是没办法总结,只有:
双指针 排序 滑动窗口 贪心算法 动态规划 还算是典型的好总结一些 接下来会分专题进行总结
所以总的来说 应该用什么思路去想一个从来没见过的题目呢?
首先定义一下这个问题:输入是什么 输出是什么 属于什么类型的问题(字符串?数组?Math?树?图?)想一想每个要注意什么问题 有什么被常用的数据结构?有什么常用的算法?
如果毫无头绪 可以把数据结构过一遍 想像有没有非常适合这道题目的(这很考验经验)
然后过一遍有哪些算法(技巧)【这个很不现实 因为既没有那么多时间 也没有办法想到所有的算法】
如果还是啥都没有 想一下暴力解法 然后开始写 刚开始不要担心时间和空间复杂度的问题 那怕用的自己都不好意思了 只要能做出来就行。
然后就是熟练程度和follow up优化了 这个太考验功力了 总结性的东西就只能帮到这里了。
补充:
看到了某个老哥的思路 感觉很有用,原文链接如下:
BASIC THINKING METHODOLOGIES


浙公网安备 33010602011771号