目录
假设你正在爬楼梯。需要
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); } }