ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

LeetCode算法题目之70.爬楼梯

2021-03-04 14:04:02  阅读:195  来源: 互联网

标签:爬楼梯 temp int climbStairs2 System 70 println LeetCode out


LeetCode算法题目之70.爬楼梯

题目描述:

假设你正在爬楼梯。需要 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 阶

 

解答:

一:递归方式

    public static void main(String[] args) {
//        int n = 1;
//        int n = 4;
//        int n = 5;
        int n = 45;
        System.out.println(climbStairs1(n));
//        System.out.println(climbStairs2_temp(n));
//        System.out.println(climbStairs3(n));

    }
    // 普通递归方式,时间复杂度2的N次方,空间复杂度N
    // n=45时,超时间限制
    public static int climbStairs1(int n) {
        /**
         * 由示例可知,n=1则1种(1),n=2则2种(1+1,2),n=3时3种(1+1+1,1+2;2+1),n=4时5种(2阶时+2;3阶时+1)即(2种+3种),n=5为n=4的种类数加n=3的种类数
         * 即有爬楼梯方法种数f(n) = f(n-1)+f(n-2),n>=3
         */
        if(n==1){
            return 1;
        } else if(n==2){
            return 2;
        } else {
            return climbStairs1(n-1) + climbStairs1(n-2);
        }
    }

二:记忆递归方式

    public static void main(String[] args) {
//        int n = 1;
//        int n = 4;
//        int n = 5;
        int n = 45;
//        System.out.println(climbStairs1(n));
        System.out.println(climbStairs2_temp(n));
//        System.out.println(climbStairs3(n));

    }
    // 记忆递归方式,时间复杂度N,空间复杂度N
    // n=44时,超时间限制
    public static int climbStairs2_temp(int n) {
        int[] temp = new int[n+1];
        return climbStairs2(n,temp);
    }
    public static int climbStairs2(int n, int[] temp) {
        /**
         * 有爬楼梯方法种数f(n) = f(n-1)+f(n-2),n>=3
         *              f(1)=1; f(2)=2
         * 若n=45,则将44时和43时种类数存入数组temp,同理42~3的所有种类数亦被存储,故递归上跳时无需重复计算
         */
        if (temp[n]>0){ // 若计算过n的种类数,则无需计算
            return temp[n];
        }
        if(n==1){
            return 1;
        } else if(n==2){
            return 2;
        } else {
            return climbStairs2(n-1,temp) + climbStairs2(n-2,temp);
        }
    }

三:动态规划方式

    public static void main(String[] args) {
//        int n = 1;
//        int n = 4;
//        int n = 5;
        int n = 45;
//        System.out.println(climbStairs1(n));
//        System.out.println(climbStairs2_temp(n));
        System.out.println(climbStairs3(n));

    }
    // 动态规划方式,时间复杂度N,空间复杂度1
    public static int climbStairs3(int n) {
        /**
         * 1;2; (1+2)3; (2+3)5; (3+5)8; (5+8)13
         * 定义 left right add
         */
        int left=0;
        int right=0;
        int add=1;
        for(int i=1; i<=n; i++){
            right = left; //      0; 1; 1; 2
            left = add; //        1; 1; 2; 3
            add = right+left; /// 1; 2; 3; 5
        }
        return add;
    }

 

 

标签:爬楼梯,temp,int,climbStairs2,System,70,println,LeetCode,out
来源: https://blog.csdn.net/csdn_lan/article/details/114366504

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有