算法 常用思路

原文: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 能够使算法复杂度降低也是一个很好的方法。

 

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

 

posted @ 2019-02-12 20:53  sw008  阅读(240)  评论(0编辑  收藏  举报