网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
class Solution {
public:
int jumpFloor(int number) {
if(number == 0 || number == 1)
{
return 1;
}
if(number == 2)
{
return 2;
}
//dp[n] = dp[n-1] + dp[n-2]
//为了让跳法和跳上的台阶数对应
int\* dp = new int[number+1];
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
//计算跳上第number阶台阶的跳法,从跳上第三阶开始需要计算
for(int i = 3;i<=number;i++)
{
dp[i] = dp[i-1]+dp[i-2];
}
int ans = dp[number];//先记录答案,跳上第number阶台阶的跳法
delete[] dp;//要释放内存
return ans;
}
};
方法2:直接迭代,细看这个方程,本质就是斐波那契数列
注意:此处是从i=2开始,计算到 i=number,i=2开始计算的f3是跳第三级台阶的
class Solution {
public:
int jumpFloor(int number) {
if(number == 0 || number == 1)
{
return 1;
}
if(number == 2)
{
return 2;
}
int f1 = 1;//跳上第1级台阶的方法
int f2 = 2;//跳上第2级台阶的方法
int f3;
//从跳上第三个台阶的方法数开始计算
for(int i = 3;i<=number;i++)
{
f3 = f2+f1;
f1 = f2;
f2 = f3;
}
return f3;
}
};
//写法2:
//从跳上第三个台阶的方法数开始计算
while(number>2)
{
f3 = f2+f1;
f1 = f2;
f2 = f3;
number--;
}
return f3;
矩形覆盖
我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形.请问用n个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,总共有多少种方法?
比如n=3时, 2*3 的矩形块有3种覆盖方法:
用n个2\*1的小矩形无重叠地覆盖一个2\*n的大矩形
每次放置的时候,无非两种放法,横着放或竖着放:
其中,横着放一个之后,下一个的放法也就确定了,故虽然放置了两个矩形,但属于同一种放法,如果横着放一个,下一个必定也要横着放,所以要依次横着放两个
其中,竖着放一个之后,本轮放置也就完成了,也属于一种方法
所以,当2\*n的大矩形被放满的时候,它无非就是从上面两种放置方法放置来的
我们继续使用dp来进行处理,当然后续会发现,斐波那契数列的方式也可以处理
状态定义:f(n) : 用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形所用的总方法数
状态递推:f(n) = f(n-1)【最后一个竖着放】 + f(n-2)【最后两个横着放】
初始化:f(1) = 1,f(2) = 2,f(0)=0, 注意f(0)我们这个可以不考虑,题目说了,约定 n == 0 时,输出 0
表达式 | 含义 |
---|---|
f(n) | 用2*1的小矩形无重叠的覆盖一个2*n的大矩形的总方法数 |
f(n-1) | 用2*1的小矩形无重叠的覆盖一个2*(n-1)的大矩形的总方法数 |
f(n-2) | 用2*1的小矩形无重叠的覆盖一个2*(n-2)的大矩形的总方法数 |
情况1:要覆盖一个2*n的矩形, 若我们规定最后一个放置的小矩形是竖着放的,那么覆盖该大矩形的覆盖总方法数就等于覆盖2*(n-1)的大矩形的总方法数
情况2:要覆盖一个2*n的矩形, 若我们规定最后一个放置的小矩形是横着放的->则倒数第二个也一定要是横着放的,那么覆盖该大矩形的覆盖总方法数就等于覆盖2*(n-2)的大矩形的总方法数
而实际覆盖的时候,我们不知道最后一个是竖着放还是横着放的,所以覆盖总方法数应该是这两种情况的方法数之和
->f(n) = f(n-1)+f(n-2)
class Solution {
public:
int rectCover(int number) {
//number = 0,1,2
![img](https://img-blog.csdnimg.cn/img_convert/18ed6a8ef8e1903e296721c4f28ae326.png)
![img](https://img-blog.csdnimg.cn/img_convert/e3693f8582adba6db4e787a0cbae2155.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**