LeetCode-探索-初級算法-動態規劃-1. 爬樓梯(個人做題記錄,不是習題講解)

LeetCode-探索-初級算法-動態規劃-1. 爬樓梯(個人做題記錄,不是習題講解)

LeetCode探索-初級算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/

  1. 爬樓梯
  • 語言: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;
        }
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章