爬楼梯
题意 :
您正在爬楼梯。它需要n步才能到达顶部。每次您可以爬1或2步。您可以通过几 种不同的方式登顶?
注意:给定n将为正整数。
思路:
方法一:这道题目仔细想想就是斐波那契数列的变种采用递归的方法实现。
方法二:采用记忆化搜素的方法实现。
方法二:采用动态规划的方法实现。
代码解释:
1.递归:
时间复杂度为O(2^n) 以为每次都需要求解子过程
public int climbStairs(int n){
if (n==1) return 1;
if (n==2) return 2;
return climbStairs(n - 2)+climbStairs(n-1);
}
2.记忆化搜索HashMap:
时间复杂度为O(n)
public int climbStairsMap(int n){
Map<Integer,Integer> map=new HashMap<>();
map.put(1,1); //台阶为1的时候不需要求存入map
map.put(2,2);
if(map.containsKey(n)){ //每次求解的时候都查询一下map中是否存在
return map.get(n);
}else {
int value=climbStairsMap(n-1)+climbStairsMap(n-2);
map.put(n,value);
return value;
}
}
2.动态规划:
时间复杂度为O(n)
为什么可以用动态规划 因为来到这步台阶跟你怎么来的没有关系 只跟你的前一步和前两步有关系 属于无后效性问题。
public int climbStairsDp(int n){
if(n<0) return 0;
int[] dp=new int[n+1]; //定义一个一维数组放入之前求解的结果
dp[0]=1;
dp[1]=2;
for (int i = 2; i <=n ; i++) {
dp[i]=dp[i-2]+dp[i-1];
}
return dp[n-1];
}