算法 常用思路
原文:https://blog.csdn.net/buyulian/article/details/77988006
暴力法
对于一些简单的题或者是数值范围较小暴力不会时间超限的那种题。一般笔试时,若想不出 ac 的算法,能暴力通过一部分也是可以的。
从简单情况开始寻找规律
对于一个题,可以看下在简单情况下的数值,以寻求他的内在规律或者为破解复杂的情况提供线索。如登台阶的那个题,一次可以上 1 个或者上 2 个,问上 n 层有多少种方法。这个题当我们考虑 n=1,2,3,4 时的情况时就很容易发现这不就是斐波那契数列吗?
想想是否做过类似的题
并尝试能否转化为我们所熟悉的类型。例如,其实有些题就是一个图论,就是隐藏的较深,我们转化一下或许就能拨开云雾见青天了。
从特殊情况开始分析
就是类比。例如,当我们解决一个二维三维情况下的题目时,我们可以从一维开始分析。
数组/链表定位
不要总循环考虑直接定位。比如当前位置的前边两位比较,A[i]>A[i-2],node>node.pre.pre,这样就减少循环遍历,要注意越界和空指针
常用的排序查找搜索算法和数据结构
从基本的常用排序查找算法切入。看有没有解决思路。
递归/回溯
递归在某些问题上会是问题思路更加清晰,也会大大减少某些题的难度。特别适合于哪些 n =? 怎么样的问题。
分治(log)
分治主要是减少问题的规模,分治的主要难点在于合并两个子问题的结果。
二分
二分不仅仅是有序性查找,也是一种临界值的好方法。找到点的其左边全部满足条件,右边都不满足条件,则此点临界值
动态规划
动态规划就是寻找最优子结构,并最大化减少递归计算中重复计算子问题的情况。用动态规划时,若一时没有思路,可以先暴力,然后寻找分析暴力中哪些子问题被重复计算了,对于发现的重复计算的问题,用动态规划的方式去消除它。
贪心算法
若一个题具有明显的贪心倾向,可以先用贪心算法试一下,能证明这个贪心算法是正确的最好,不能证明的话就尝试看能不能找一个反例,如果找不到反例就证明这个算法勉强能用。
位运算
对于一些没有太好思路的题,位运算或许能收获到意想不到的后果。
暴力打表寻找规律
就是用程序暴力例举出数值小时的情况,看看能不能发现什么规律。
分情况解决
我们不一定非得所有情况都用一种方式解决。不同的情况,若我们多加几个 if 能够使算法复杂度降低也是一个很好的方法。
从任意一个情况开始分析
若都没有太好的思路,先随便分析一种情况,或许分析着分析着思路就出来了。