Java&LeetCode 初入門——070. 爬樓梯
阿新 • • 發佈:2019-01-14
Java&LeetCode 初入門——070. 爬樓梯
文內程式碼全部採用JAVA語言。
題目
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?注意:給定 n 是一個正整數。
測試用例
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1. 1 階 + 1 階
2. 2 階
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1. 1 階 + 1 階 + 1 階
2. 1 階 + 2 階
3. 2 階 + 1 階
個人解法
看答案之前,我覺得我的答案應該還湊合。看完答案之後,我只想呵呵自己,為什麼不看提示。提示裡都寫的明明白白啊!
心路歷程:首先看到的時候,覺得是個排列組合問題,完全沒有往動態規劃那方面考慮。於是自己手動寫了一個求組合數的程式,int不夠長用long,long也不夠長用BigInteger。最後只打敗了1%,我就傻眼了。我的破答案就不上傳了,簡直丟人。
哎,其實我這個求組合數的程式,寫的應該還可以。
直接學習一下大佬們的遞迴求解。
大神解法
方法
動態規劃
思路
假設10級臺階,最後一步如果走一級,那前面就是9級臺階的走法;最後一步走兩級,前面就是8級臺階的走法。所以10級臺階就是9級臺階的走法+8級臺階的走法。
能理解這個程式碼就好寫多了。
演算法
簡單的遞迴,不過多解釋。
執行用時: 3 ms, 在Climbing Stairs的Java提交中擊敗了79.10% 的使用者
class Solution {
public int climbStairs(int n) {
if (n <= 1)
return 1;
else if (n == 2)
return 2;
else {
int res = 0;
int i = 1, j = 2;
int k = 3;
while (k <= n) {
res = i + j;
i = j;
j = res;
k++;
}
return res;
}
}
}
哎,數學還是差啊!