LeetCode:70.爬楼梯

LeetCode:70.爬楼梯_第1张图片

题目分析:数学归纳法,没有思路,尝试寻找规律

设f(n)为n级台阶的走法,有

f(1) = 1;

f(2) = 2;

f(3) = 3;

f(4) = 5;

......

f(n) = f(n-1) + f(n-2); n>2

这个规律是从前面一些输入对应的输出得出的,没有经过严格的证明,可以通过高中数学归纳法进行证明

换一种思路来理解:要走第n级台阶,要么从第n-1级走1步上来,要么从第n-2级走2步上来,第n-1的总共走法就是f(n-1),

第n-2级走法就是f(n-2);这样也就是递归的思路

解法一:递归解法代码如下:

class Solution {
    private static Map hadSoluted = new HashMap<>();
    public int climbStairs(int n) {
        if(n==1) {
            return 1;
        }
        if(n==2) {
            return 2;
        }
        if(hadSoluted.containsKey(n)) {
        	return hadSoluted.get(n);
        }
        Integer result = climbStairs(n-1) + climbStairs(n-2);
        hadSoluted.put(n, result);
        return result;
    }
}

注意到递归有些值会重复计算,时间复杂度会是O(2^n),为了避免一些已经计算了的值重复计算,可以缓存起来。

提交结果:

LeetCode:70.爬楼梯_第2张图片

解法二:注意到只需要算出n阶有几种走法,算n阶的走法需要知道n-1阶和n-2阶的走法,所以可以保存起来,使用循环解决

class Solution {
    public static int climbStairs(int n) {
        if(n<3) {
        	return n;
        }
		
        int f1 = 1;
        int f2 = 2;
        int f3 = 3;
        
        for(int i=3; i

提交结果:

你可能感兴趣的:(LeetCode)