LeetCode-探索-初级算法-动态规划-1. 爬楼梯(个人做题记录,不是习题讲解)
LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/
- 爬楼梯
-
语言:java
-
思路:写了一个很粗略的递归,直接超时,失败了,没想到要怎么做。
-
参考代码1(0ms):爬楼梯每次只有两种走法,要么1要么2,且如果走2,其实还可以把2拆成2个1,即走1是1种走法,走2是2种走法;那么每次都分2个分支走,一个分支走1,1个分支走2,直到最后分支的末尾步数小于2时即可知道结果。
https://blog.csdn.net/qq_38595487/article/details/79686081
class Solution { public int climbStairs(int n) { if(n == 1) return 1; if(n == 2) return 2; int[] nums = new int[n+1]; nums[1] = 1; nums[2] = 2; climb(nums,n); return nums[n]; } public static void climb(int[]nums, int n){ int x = n-1; int y = n-2; if (x > 2 && nums[x] == 0) climb(nums,x); if (y > 2 && nums[y] == 0) climb(nums,y); nums[n] = nums[x] +nums[y]; } }
-
参考代码2(0ms):一开始没看懂,后面才知道这个就是斐波那契,
F(n)= F(n-1) + F(n-2);
class Solution { public int climbStairs(int n) { if (n < 3) { return n; } int res = 0; int i = 1, j = 2; for (int k = 3; k <= n; k++) { res = i + j; i = j; j = res; } return res; }
}
- 参考1后重写(0ms):这里判断vals[x]或者vals[y]是不是0就是看是否重复计算了同一个位置F(n),其实还是那个斐波那契的比较好,只是需要时间理解。
class Solution {
public int climbStairs(int n) {
int[] vals = new int[n+1];
if(n<3)
return n;
vals[1] = 1;
vals[2] = 2;
climb(vals,n);
return vals[n];
}
public void climb(int[] vals,int n){
int y = n-1;
int x = n-2;
if(x > 2 && vals[x] == 0){
climb(vals,x);
}
if(y > 2 && vals[y] == 0){
climb(vals,y);
}
vals[n] = vals[x] + vals[y];
}
}
-
参考2后重写(0ms):
class Solution { public int climbStairs(int n) { if(n<3) return n; int first = 1; int second = 2; int res = 0; for(int i = 3; i <= n; ++i){ res = first + second; first = second; second = res; } return res; } }