剑指offer8_跳台阶_题解

跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

示例1

输入

1

返回值

1

示例1

输入

4

返回值

5

分析

方案一:递归

假设f(i)表示跳上i个台阶上可能的方法数。逆向思维。如果我从第n个台阶进行下台阶,下一步有2中可能,一种走到第n-1个台阶,一种是走到第n-2个台阶。所以有

\[递推公式:f(n) = f(n-1) + f(n-2) \]

\[递归边界:f(0)=f(1)= 1 \]

/**
时间复杂度:O(2^n)
树的结点个数
空间复杂度:递归栈的空间
**/
class Solution {
public:
    int jumpFloor(int number) {
        if(number == 1 || number == 2){
        	return number;
		}
		return jumpFloor(number - 1) + jumpFloor(number - 2);
    }
};

方案二:记忆化搜索

在递归过程中用数组将已经计算过的值保存下来

/**
时间复杂度:O(n)
没有重复计算
空间复杂度:O(n)和递归栈的空间
**/
class Solution {
public:
    int j[39] = {0};
    int jumpFloor(int number) {
        if(number == 1 || number == 2){
            return number;
        }
        if(j[number] != 0){
        	return j[number];
		} 
        return j[number] = jumpFloor(number - 1) + jumpFloor(number - 2);
    }
};

方案三:动态规划

/**
时间复杂度:O(n)
没有重复计算
空间复杂度:O(n)
**/
class Solution{
public:
	int jumpFloor(int number){
		if(number == 1 || number == 2)
			return number;
		int j[39] = {0};
		j[1] = 1, j[2] = 2;
		for(int i = 3; i <= number; i++){
			j[i] = j[i - 1] + j[i - 2];		
		}
		return j[number];
	}		
}; 

方案四:方案三优化

只使用3个变量a,b,c

/**
时间复杂度:O(n)
没有重复计算
空间复杂度:O(1)
**/
class Solution {
public:
	int jumpFloor(int number) {
	    if(number == 1 || number == 2){
	        return number;
	    }
	    int a = 1, b = 2, c;
	    for(int i = 3; i <= number; i++){
	        c = a + b;
	        a = b;
	        b = c;
	    }
	    return c;
	}
};
posted @ 2020-12-07 19:03  RiverCold  阅读(71)  评论(0编辑  收藏  举报