最近在某公众号上看到了一道算法题,在思考它的过程中发现了一些很有意思的新问题,解决后决定写下这篇博客记录一下。
首先来看看问题:
现在有两种砖,分别是是1*1,的砖和1*2的砖,用着两种砖铺1*n的地面。问共有多少种铺法?(输入为n,请输出相应的铺法数)
Ok,那么让我们来先来分析一下这个问题吧。
一、用数学思维分析问题
根据题目我们可以知道砖一共两种,分别是1*1和1*2两种,需要把两种砖铺成1*N的面积。我们先换个思路,将这个问题转换成数学问题看看,设需要1*1的砖共x块,1*2的砖y块,则可以得出方程x+2y=n,函数图像如下图所示。
因为x,y,n为正整数,所以对端点的取值仍然需要进行分析。x+2y=n与x轴的交点为(n,0),因为n为整数,所以(n,0)可以取到(对应情况为全部用1*1的砖铺);x+2y=n与y轴的交点为(0,n/2),这个点与n为奇数或偶数有关,当为奇数时这个点无法取到只能取与其最接近的y为整数的点(尽可能使用1*2的砖铺,最后的空用1*1的补上)。
因为x+2y=n,所以x+y=n-y,取值范围为[n/2,n],因为n/2不一定符合要求,所以对于x+y的值得两个极值取值定义如下。
int maxCnt = n; //全部使用1*1的砖
int minCnt = n/2 + n%2; //尽可能使用1*2的砖
明确了这些我们就可