LeetCode算法题之746. Min Cost Climbing Stairs(easy)【Python3题解】

题目描述:
On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed).

Once you pay the cost, you can either climb one or two steps. You need to find minimum cost to reach the top of the floor, and you can either start from the step with index 0, or the step with index 1.

Example 1:

Input: cost = [10, 15, 20]
Output: 15
Explanation: Cheapest is start on cost[1], pay that cost and go to the top.

Example 2:

Input: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
Output: 6
Explanation: Cheapest is start on cost[0], and only step on 1s, skipping cost[3].

Note:

cost will have a length in the range [2, 1000].
Every cost[i] will be an integer in the range [0, 999]

题目大意:

  • 首先撕开什么爬楼梯的外衣,那只是这道题套的名字
  • 其实让你做的就是给定你一个数组,每个数值分别代表你爬到那一层了,也就是第i层时,你要花的成本,然后依据题意,当你到达最后一个元素时,或者倒数第二个元素时,就算到顶了
  • 然后最开始的时候,你可以选择在第一个元素的位置开始走,你也选择在第二个元素的位置开始走,每次能走一步或者两步
  • 问你到达顶端,所需要最小的成本是?

解题思路:

  • 首先说明一下的是,这道题是在动态规划的标签下的题目,故少不了动态规划的思路和解法
  • 那么既然是动态规划,直接上了,首先就是dp数组,那个dp table的定义是什么,dp[i]代表的含义是什么,一定要在做题之前将它想清楚,因为它决定了你后面能不能推的出来
  • 这里我们这样定义,dp[i]代表到达第i个位置所需要的最小成本
  • 那么接下来就是动态规划的重头戏了,找递推关系,那么到底是什么关系,就要看题意了,其实个人觉得也就是我们人为是怎么思考的,将它转换成公式,就是那个递推关系了
  • 什么意思?题中要求到达顶端的最小成本,怎么求?因为你每次可以走一步或者两步,你也不知道哪种情况你是最小成本,所以,需要取二者的最小值
  • 哪两者的最小值呢?还不是你当前在的位置的前一个元素,或者前两个元素的数值,加上你当前在的位置的数值,看看哪个小,要哪个,这也就是那个递推关系
  • 因为你dp[i]的数值已经代表了第i个位置所需要的最小成本,依次按照上面的关系推进过去,推到最后一个即完成
  • 到时比较dp数组的最后两个值,谁大谁小,要小的,即可

少废话,上代码:

class Solution:
    def minCostClimbingStairs(self, cost):
        # 如果cost的长度为1,那么到达顶端最小的成本当然就是cost[0]
        # 而且下列动态规划的代码,也主要是在cost长度大于1时设计的
        # 否则会超索引
        if len(cost) == 1:
            return cost[0]

        dp = [] # 定义一个dp数组,用来装到达第i个元素的位置时候,最小的成本
        # 将base case 加入到dp数组中
        dp.append(cost[0])
        dp.append(cost[1])
        # 从第三个元素开始,到最后一个元素为止
        # 开始按照题目规则,逐步推出下一个值
        for i in range(2, len(cost)):
            # 这就是题目的规则,也就是动态规划较难想出来的地方
            dp_i = min(cost[i]+dp[i-1], cost[i]+dp[i-2])
            # 补到dp数组中
            dp.append(dp_i)

        # 因为到达顶端,有两种可能,一个是就是最后一个元素的位置
        # 还有一个是到达倒数第二个元素位置时,也可以视为到达顶端
        # 所以返回时,返回二者小的即可
        return min(dp[-1], dp[-2])

运行时间和内存占用:

  • Runtime: 60 ms, faster than 51.36% of Python3 online submissions for Min Cost Climbing Stairs.
  • Memory Usage: 14.1 MB, less than 7.69% of Python3 online submissions for Min Cost Climbing Stairs.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值