基础算法思维:
1.穷举&遍历
2.递推
例如:兔子繁殖问题,构建带有月份属性的兔子数据结构,按月份递增循环模拟兔子繁殖来推算;
3.回溯4.递归
例如:对长度为n的列表,生成n*n-1*n-2*n-3*...*3*2*1种情况的排列;
高级算法思维:
1.分治
分治法所能解决的问题一般具有以下几个特征:
1) 该问题的规模缩小到一定的程度就可以容易地解决
2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3) 利用该问题分解出的子问题的解可以合并为该问题的解;
4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
分治常与递归一同应用,以最大子序列问题为例:
对于最大子序列问题,普通方法是全遍历的穷举然后比较,算法复杂度高且耗时长;
进阶一下可以对序列进行处理,去除两端的负数并将序列中相邻的正数或负数合并,以降低复杂度;
从递归角度来分析,把序列分为两部分,最大子序列可能出现在左半部分,或者右半部分,或者是两者之间。两者之间的情况下,先对左半部分求以最后一个数字为结尾的最大序列和。然后对右半部分以第一个数字开始算最大序列和,将两者加起来即是;
从另外一种角度来分析,通过对算法目标(子序列最大和)的理解抽象出一些事实规则,通过判断实时更新的子序列和或小于0或大于当前max来进行处理,达到一次循环完成计算的目的。
link:https://blog.youkuaiyun.com/zwhlxl/article/details/42649979
2.动态规划
动态规划是算法思维中最有趣的部分也是比较困难的部分,因此单开一篇来记录学习。
3.贪心
TBD
其他:
例如:针对长度为n的数字列表,判断是否能组成顺子炸弹金 (456 or 666)
可以抽象为从0到9的顺序数字对应个数,顺子即为某一位数字个数大于0且连续后两位数字个数大于0,
炸弹即为某一位数字个数大于3,通过从0到9循环判断和不断减去已发现的顺子和炸弹数字个数,判断
最后是否有剩余数字个数来得出结论。