LeedCode50爬楼梯问题------递归与非递归实现

目录

1. 爬楼梯

2.剑指 Offer 10- I. 斐波那契数列

3.跳台阶的扩展问题(牛客)


假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

思路:

1.采用递归的方法,只需要管第一步走一个台阶或者俩个台阶,后面的台阶怎么走,交给函数。

但是直接用递归return climbStairs(n-1)+climbStairs(n-2);

时间复杂度为O(n^2),力扣会提示超出时间限制,所以不可以(因为里面会有很多重复便利的元素)

所以用一个HashMap来保存计算出的要走的步数的方法

这样已经递归过的台阶值不用再递归一遍,时间复杂度O(n)

代码示例: 

递归的方法:

class Solution {
    HashMap<Integer,Integer> map =new HashMap<>(); //写Map和HashMap都可以这里
    public int climbStairs(int n) {
        //直接用递归的方法会超出时间限制,所以我们采用hashMap来保存已经递归得到的值
    if(n==1)return 1;
    if(n==2)return 2;
        if(map.get(n)!=null){
            return map.get(n);
        }else{
            int result= climbStairs(n-1)+climbStairs(n-2);
            map.put(n,result);
            return result;
        }
    }
}

非递归的方式: 自顶向上的去做累加,也就是说,3个楼梯方法=2个楼梯的方法+1个楼梯的方法

4个楼梯方法=3个楼梯的方法+2个楼梯的方法

5个楼梯方法=4个楼梯的方法+3个楼梯的方法

6个楼梯方法=5个楼梯的方法+4个楼梯的方法

n个楼梯方法=n-2个楼梯的方法+n-1个楼梯的方法,时间复杂度O(n)

class Solution {
    //非递归的方法
    public int climbStairs(int n){
        if(n==1)return 1;
        if(n==2)return 2;
        int result =0;
        int pre =2;
        int prePre=1;
        for(int i=3;i<=n;i++){
            result =pre+prePre;
            prePre=pre;
            pre=result;
        }
          return result;
    }
  

}

 2.类比与斐波那契数列

2.剑指 Offer 10- I. 斐波那契数列

难度简单363

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:1

示例 2:

输入:n = 5
输出:5
class Solution {
    //这是递归的解法,还有非递归的解法,官方题解也是非递归
    Map<Integer,Integer>map =new HashMap<>();
    public int fib(int n) {
        final int MOD =1000000007;
    if(n==0)return 0;
    if(n==1)return 1;
    if(map.get(n)!=null){
        return map.get(n);
    }else{
         int result=fib(n-1)+fib(n-2);
         map.put(n,result%MOD);
         return result%MOD;
        }
    }
}

3.跳台阶的扩展问题(牛客)

这道题实际上就是找规律问题,你会发现,n的跳法=n-1的跳法乘二,比之前的代码还要简单一点

 链接:跳台阶扩展问题__牛客网
来源:牛客网
 

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。

数据范围:1≤n≤201 \le n \le 201≤n≤20
进阶:空间复杂度 O(1)O(1) O(1) , 时间复杂度 O(1)O(1)O(1)

示例1

输入

3

输出

4

示例2

输入

1

输出

1
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param number int整型 
     * @return int整型
     */
    public int jumpFloorII (int number) {
        //这道题就是找规律,然后你会发现number的次数等于2倍的number-1
       if(number==1)return 1;
        if(number==2)return 2;
        return 2*jumpFloorII(number-1);
    }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值