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;
        }
    }
    
发布了60 篇原创文章 · 获赞 6 · 访问量 5527

猜你喜欢

转载自blog.csdn.net/Ashiamd/article/details/102473212
今日推荐