0
点赞
收藏
分享

微信扫一扫

Leetcode70. 爬楼梯

sunflower821 2022-02-05 阅读 48

题目描述:

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

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

示例:

本题与斐波那契数列问题非常类似。

在要爬n级台阶的情况下,最后一步有且仅有这两种可能:

可能1:最后一步仅上了一级台阶。此时人是站在第n-1阶台阶上向上迈出的最后一步。

可能2:最后一步是登了两级台阶。此时人是站在第n-2阶台阶上向上迈出的最后一步。

对于可能1,我们只要算出人从地面迈上n-1阶台阶的方法数,就是可能1总共的方法数,问题规模从n缩减为n-1。

同样地,对于可能2,我们只要算出人从地面迈上n-2阶台阶的方法数,就是可能2总共的方法数,问题规模从从n缩减为n-2。

因此,从地面迈上n阶台阶的方法数F(n) = F(n-1)+F(n-2)。这和斐波那契非常相似。

再考虑初始条件,只有一个阶梯时只有一种方法,有两个台阶时有(1)一步迈两个台阶和(2)一步一个台阶,迈两次。这两种方法。因此F(1)=1, F(2)=2。

代码:

class Solution {
public:
    int climbStairs(int n) {
        if(n == 1 || n == 2) return n;
        int a = 1;
        int b = 2;
        for(int i = 3; i < n; i++){
            b = a + b;
            a = b - a;
        }
        return a + b;
    }
};

该题进阶可查看第746题最小代价爬楼梯

Leetcode746.最小代价爬楼梯

题目描述:

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例1:

示例2:

提示:

代码如下:

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n = cost.size();
        int a = cost[0];
        int b = cost[1];
        int min;
        for(int i = 2; i < n; i++){
            min = a < b ? a : b;
            a = b;
            b = min + cost[i];
        }
        return a < b ? a : b;
    }
};
举报

相关推荐

0 条评论