70 爬楼梯
题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
题目想不出来的时候找找重复性
斐波那契数列
第n个台阶只能从第n-1或者n-2个上来。到第n-1个台阶的走法 + 第n-2个台阶的走法 = 到第n个台阶的走法
递推公式:斐波那契数列: f(x)=f(x−1)+f(x−2)
时间复杂度:O(n)
空间复杂度:O(1)
//java
class Solution {
public int climbStairs(int n) {
int p = 0, q = 0, r = 1;
for (int i = 1; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
}
}
动态规划
时间复杂度:O(n)
空间复杂度:O(n)
复习java创建数组
//方法一
//创建 double类型数组,大小为size,名字是myList
//注意 虽然大小是size,但是数组是从0 到(size-1)计数
double[] myList = new double[size];
//方法二
dataType[] arrayRefVar = {value0, value1, ..., valuek};
//二维数组
type[][] typeName = new type[typeLength1][typeLength2];
//创建一个int类型,2行3列的数组,名称是a
int a[][] = new int[2][3];
//java
class Solution {
public int climbStairs(int n) {
if(n==1){
return 1;
}
//创建一个数组用于保存
int[] dp = new int[n+1];
dp[1]=1;
dp[2]=2;
for(int i =3;i<=n;i++){
dp[i] = dp[i-1]+dp[i-2];
}
return dp[n];
}
}
复习python创建字典
python具有列表,元组,字典
字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中
#创建一个字典
d = {key1 : value1, key2 : value2 }
class Solution:
def climbStairs(self, n: int) -> int:
//创建一个字典
dp = {}
dp[1] = 1
dp[2] = 2
for i in range(3,n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]