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; } }