列表

详情


BM64. 最小花费爬楼梯

描述

给定一个整数数组 ,其中 是从楼梯第个台阶向上爬需要支付的费用,下标从0开始。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

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

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

数据范围:数组长度满足 ,数组中的值满足

示例1

输入:

[2,5,20]

输出:

5

说明:

你将从下标为1的台阶开始,支付5 ,向上爬两个台阶,到达楼梯顶部。总花费为5

示例2

输入:

[1,100,1,1,1,90,1,1,80,1]

输出:

6

说明:

你将从下标为 0 的台阶开始。 1.支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。 2.支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。 3.支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。 4.支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。 5.支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。 6.支付 1 ,向上爬一个台阶,到达楼梯顶部。 总花费为 6 。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Rust 解法, 执行用时: 11ms, 内存消耗: 2816KB, 提交时间: 2022-07-01

struct Solution{

}

impl Solution {
    fn new() -> Self {
        Solution{}
    }

    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param cost int整型一维数组 
        * @return int整型
    */
    pub fn minCostClimbingStairs(&self, cost: Vec<i32>) -> i32 {
        // write code here
        let n = cost.len();
//         let mut dp = vec![0; n + 1];
        let (mut ret, mut po, mut pt) = (0, 0, 0);
        for i in 2..n {
            ret = self.min(po + cost[i - 1], pt + cost[i - 2]);
            pt = po;
            po = ret;
        }
        ret = self.min(po + cost[n - 1], pt + cost[n - 2]);
        ret
    }
    
    fn min(&self, a: i32, b: i32) -> i32 {
        if a > b {
            return b
        }
        a
    }
}

C++ 解法, 执行用时: 11ms, 内存消耗: 3072KB, 提交时间: 2022-07-18

static const auto io_sync_off = [](){
    std::ios::sync_with_stdio(false);
    std::cout.tie(nullptr);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int>dp(cost.size());
        dp[0]=cost[0];
        dp[1]=cost[1];
        for(int i=2;i<cost.size();i++)
        {
            dp[i]=min(dp[i-1],dp[i-2])+cost[i];
        }
        return min(dp[cost.size()-1],dp[cost.size()-2]);
    }
};

C++ 解法, 执行用时: 11ms, 内存消耗: 3076KB, 提交时间: 2022-08-06

static const auto io_sync_off = [](){
    std::ios::sync_with_stdio(false);
    std::cout.tie(nullptr);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cost int整型vector 
     * @return int整型
     */
    int minCostClimbingStairs(vector<int>& cost) {
        int a[100010];
        a[0]=cost[0];
        a[1]=cost[1];
        int i;
        for(i=2;i<cost.size();i++){
           a[i]=min(a[i-1],a[i-2])+cost[i];
        }
        return min(a[i-1],a[i-2]);
    }
};

C++ 解法, 执行用时: 11ms, 内存消耗: 3616KB, 提交时间: 2022-07-24

static const auto io_sync_off = [](){
    std::ios::sync_with_stdio(false);
    std::cout.tie(nullptr);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cost int整型vector 
     * @return int整型
     */
    int minCostClimbingStairs(vector<int>& cost) {
        // write code here
        int n = cost.size();
        if (n == 1) return cost[0];
        if (n == 2) return min(cost[0], cost[1]);
        vector<int> dp(n);
        dp[0] = cost[0];
        dp[1] = cost[1];
        for (int i = 2; i < n; ++i) {
            dp[i] = cost[i] + min(dp[i - 1], dp[i - 2]);
        }
        return min(dp[n - 1], dp[n - 2]);
    }
};

C++ 解法, 执行用时: 12ms, 内存消耗: 3076KB, 提交时间: 2022-07-30

const auto io_sync_off=[]() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cost int整型vector 
     * @return int整型
     */
    int minCostClimbingStairs(vector<int>& cost) {
        // write code here
        for (int i = cost.size() - 3; i >= 0; i--)
            cost[i] += min(cost[i + 1], cost[i + 2]);
        return min(cost[0], cost[1]);
    }
};

上一题