最近在做一些逻辑算法题,以前在学校的相关课程比较水,一直没怎么做过比较考逻辑的算法题,一看到题就像用大量的for和if穷举,代码复杂度过高,各种TLE。
今天在第n次被正确答案吊打之后忽然有了一丝感悟,记下来留个纪念。
做逻辑算法题的时候首先要考虑结果的可能情况!比如:
1、是否有分界线可以让我们定出结果就在这个分界线的左面或者右面,如下题:
给定一个柱形图(每个柱子之间没有空隙),高度随机给出,宽度为固定值,求这些柱子可以构成的矩形的最大面积。
因为面积明显受制于最低的那个柱子的高度,设这个高度为l,所以以此为出发点发现了答案有三种情况:
1)最大面积包含当前最低的柱子,则面积肯定为l * n(n为总宽度及柱子的数目*单个宽度)
2)最大面积不包含当前最低柱子,则此时只有两种可能:
在当前最小柱子的左面,此时计算左面区域的最大面积
在当前最小柱子的右面,此时计算右面区域最大面积
之后比较三种情况的面积大小就可以得出最大面积,用递归的方法不断判断了,直至只有一个柱子的时候即可
2、是否可以通过(结果矩阵)相邻上下左右的值累加来逐步计算结果,经典动态规划问题里的找钱问题就属于这种
等等等等
ps:编完逻辑代码后最好带入几个简单的特殊例子尝试一下!比如一系列相同的值,一些特殊值:比如 1、0、2 什么的