【剑指offer】跳台阶+变态跳台阶 python+C++

462 阅读1分钟

【普通跳台阶:题目描述】

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

【思路】

动态规划,自底向上。前两项为,上1层=1,上2层=2;之后的关系更新关系: array[n]=array[n-1]+array[n-2],即到达当前层无非是两种,一是从n-1层跳1层,二是从n-2层跳2层。时间复杂度O(n) 【代码】

python:
class Solution:
    def jumpFloor(self, number):
        # write code here
        dp=[1,2]
        for i in range(2,number):
            dp.append(dp[i-1]+dp[i-2])
        return dp[number-1]
c++:
class Solution {
public:
    int jumpFloor(int number) {
        vector<int> array={1,2};
        for(int i=2;i<number;i++){
            array.push_back(array[i-1]+array[i-2]);
        }
        return array[number-1];
    }
};

【变态跳台阶:题目描述】

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

【思路】

双层循环向array中添加数字,array=[1,2],更新方法为: array[n]=array[n-1]+...array[n-n]+1(1表示直接跳上n层)

时间复杂度O(n*n)

【代码】

c++:
class Solution {
public:
    int jumpFloorII(int number) {
        vector<int> array={1,2};
        for(int i=2;i<number;i++){
            int num=0;
            for(int j=1;j<=i;j++){
                num+=array[i-j];
            }
            array.push_back(num+1);
        }
        return array[number-1];
    }
};
python:
# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        # write code here
        re=[1,2]
        for i in range(2,number):
            num=0
            for j in range(1,i+1):
                num+=re[i-j]
            re.append(num+1)
        return re[number-1]