12.31
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
首先确定动态数组DP为到达n阶的方法种数。
1层楼 1--1种
2层楼 1+1或者2 --2种
3层楼 2+1或者1+2 --3种
4层楼 3+1或者2+2 --5种
例如4层楼可以是由三层楼走一步到,或者两层楼走两步到(注意2+2为什么没有2+1+1,因为3+1涵盖2+1+1)
即R[n]=R[n-1]+R[n-2];
代码如下
class Solution {
public:
int climbStairs(int n) {
int a[n+1];
if(n==1)
{
return 1;
}
if(n==2)
{
return 2;
}
a[1]=1;
a[2]=2;
for(int i=3;i<n+1;i++)
{
a[i]=a[i-1]+a[i-2];
}
return a[n];
}
};
二、杨辉三角
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
要求返回二维数组。
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> dp;
for(int i=0;i<numRows;i++)
{
dp.push_back(vector<int>());//先初始化二维容器
}
dp[0].push_back(1);
if(numRows==1)
{
return dp;
}
dp[1].push_back(1);
dp[1].push_back(1);
if(numRows==2)
{
return dp;
}
for(int i=2;i<numRows;i++)
{
for(int j=0;j<i+1;j++)
{
if(j==0||j==i)
{
dp[i].push_back(1);
}
else{
dp[i].push_back(dp[i-1][j]+dp[i-1][j-1]);
}
}
}
return dp;
}
};
其中二维数组的初始化参考
c++之vector 及 二维容器vector<vector<int>>初始化方法 及 三维数组初始化_vector<vector<int>>-CSDN博客e二维容器也可以当作数组使用,其中push_back的引入很大程度方便了使用。