做算法题思路的一些总结

我算法不算太强,但也刷了不少题,这篇博客就写一下刷题时一些思路的总结吧,也算是我一个总结归纳提高的过程。

其实奇技淫巧终归不是正途,一个问题用一些高超的技巧解出来了,但换了问题就不行了。

真正的提高应该是遇到一个问题,然后为这一类问题总结思考出一个一般方法,一种不需要奇技淫巧只需要按无脑按步骤来就能解决以前那些需要高超技巧才能解决的问题的方法。

 

直接暴力

对于一些简单的题或者是数值范围较小暴力不会时间超限的那种题。一般笔试时,若想不出 ac 的算法,能暴力通过一部分也是可以的。

 

从简单情况开始寻找规律

对于一个题,可以看下在简单情况下的数值,以寻求他的内在规律或者为破解复杂的情况提供线索。如登台阶的那个题,一次可以上 1 个或者上 2 个,问上 n 层有多少种方法。这个题当我们考虑 n=1,2,3,4 时的情况时就很容易发现这不就是斐波那契数列吗?

 

想想是否做过类似的题

想想是否做过类似的题,并尝试能否转化为我们所熟悉的类型。例如,其实有些题就是一个图论,就是隐藏的较深,我们转化一下或许就能拨开云雾见青天了。

 

从特殊情况开始分析

就是类比。例如,当我们解决一个二维三维情况下的题目时,我们可以从一维开始分析。

 

动态规划

动态规划就是寻找最优子结构,并最大化减少递归计算中重复计算子问题的情况。用动态规划时,若一时没有思路,可以先暴力,然后寻找分析暴力中哪些子问题被重复计算了,对于发现的重复计算的问题,用动态规划的方式去消除它。

 

贪心算法

若一个题具有明显的贪心倾向,可以先用贪心算法试一下,能证明这个贪心算法是正确的最好,不能证明的话就尝试看能不能找一个反例,如果找不到反例就证明这个算法勉强能用。

 

递归

递归在某些问题上会是问题思路更加清晰,也会大大减少某些题的难度。特别适合于哪些 n =? 怎么样的问题。

 

分治

分治主要是减少问题的规模,分治的主要难点在于合并两个子问题的结果。

 

位运算

对于一些没有太好思路的题,位运算或许能收获到意想不到的后果。

 

暴力打表寻找规律

就是用程序暴力例举出数值小时的情况,看看能不能发现什么规律。

 

分情况解决

我们不一定非得所有情况都用一种方式解决。不同的情况,若我们多加几个 if 能够使算法复杂度降低也是一个很好的方法。

 

从任意一个情况开始分析

若都没有太好的思路,先随便分析一种情况,或许分析着分析着思路就出来了。

 

 

你可能感兴趣的:(算法)