LeetCode746 Min Cost Climbing Stairs(爬上楼梯的最小损失)
题目
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:
costwill have a length in the range[2, 1000].- Every
cost[i]will be an integer in the range[0, 999].
解法
这是一个动态规划问题,按照以下步骤来解决
1. 分析最优解的性质。并刻画其结构特征。
求最终的最小cost, 因为到最后的cost可以表示为
max(走到最后一层楼梯的最小cost,走到最后二层楼梯的最小cost)
2. 递归的定义最优解
递推定义:
cost = min(上一层的最小cost + 当前层cost, 上两层的最小cost + 当前层cost)
3. 以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值。
我们需要记录每一层的最优值(最小cost)
定义stairCost数组 stairCost[i]表示走到第i层的最小cost
递推改为:
stairCost[i] = min(stairCost[i-2] + cost[i], stairCost[i-1] + cost[i]);
4 .依据计算最优值时得到的信息,构造问题的最优解。
最优解可以表示为
min(stairCost[cost.size()-2] , stairCost[cost.size()-1]);
代码及注释
解法1:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
//定义一个数组 表示爬上每一层楼梯 需要的最少cost
vector<int> stairCost(cost.size(), 0);
//第一层楼梯和第二层楼梯的cost就是本身
stairCost[0] = cost[0];
stairCost[1] = cost[1];
//现在循环计算 后面每一层的最小cost
for (int i = 2; i < cost.size(); i++) {
stairCost[i] = min(stairCost[i-2] + cost[i], stairCost[i-1] + cost[i]);
}
//到达楼梯终点的最小cost 就是倒数第一层和第二层的最小cost值
return min(stairCost[cost.size()-2] , stairCost[cost.size()-1]);
}
};
扩展
还有一些非常类似的题目, 有异曲同工之妙
1. LeetCode70——Climbing Stairs
题目如下
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
Example 1:
Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps
Example 2:
Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step
题目设定都差不多,都是一次只能爬一层或者两次, 问爬到终点的方法共有几种?
当楼梯层数大于2时, 到达当前位置的走法可以表示为:
total_way[n] = total_way [n - 1] + total_way [n - 2]
因为到达楼梯方式有两种, 一种是从前面一层走一步过来, 另外一种是从前面两层走两步过来, 总方法 就是两者之和
其次是目标解 可以表示为最后一层的方法数
代码如下
class Solution {
public:
int climbStairs(int n) {
//特殊数据处理 当n为 1 或 2时, 返回 1 和 2
if (n <= 2) {
return n;
}
//创建数组 用了保存走到当前位置共需要的方法
int * total_way = new int[n];
//初始化条件
//走到第一层一种走法
total_way[0] = 1;
//走到第二层要两种走法
total_way[1] = 2;
//循环递推求解
for (int i = 2; i < n; i++){
//递推式
total_way[i] = total_way[i - 2] + total_way[i - 1];
}
//目的解就是走到最后一块的走法
return total_way[n - 1];
}
};
LeetCode746 Min Cost Climbing Stairs(爬上楼梯的最小损失)的更多相关文章
- Leetcode746.Min Cost Climbing Stairs使用最小花费爬楼梯
数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始). 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯. 您需 ...
- [LeetCode] Min Cost Climbing Stairs 爬楼梯的最小损失
On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...
- [LeetCode] 746. Min Cost Climbing Stairs 爬楼梯的最小损失
On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...
- leetcode746 Min Cost Climbing Stairs
""" On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 inde ...
- LeetCode 746. 使用最小花费爬楼梯(Min Cost Climbing Stairs) 11
746. 使用最小花费爬楼梯 746. Min Cost Climbing Stairs 题目描述 数组的每个索引做为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i].(索引从 0 ...
- Leetcode之动态规划(DP)专题-746. 使用最小花费爬楼梯(Min Cost Climbing Stairs)
Leetcode之动态规划(DP)专题-746. 使用最小花费爬楼梯(Min Cost Climbing Stairs) 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost ...
- Min Cost Climbing Stairs - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Min Cost Climbing Stairs - LeetCode 注意点 注意边界条件 解法 解法一:这道题也是一道dp题.dp[i]表示爬到第i层 ...
- 【Leetcode_easy】746. Min Cost Climbing Stairs
problem 746. Min Cost Climbing Stairs 题意: solution1:动态规划: 定义一个一维的dp数组,其中dp[i]表示爬到第i层的最小cost,然后来想dp[i ...
- 746. Min Cost Climbing Stairs@python
On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...
随机推荐
- 《python编程从入门到实践》2.3字符串
书籍<python编程从入门到实践> 2.3字符串 知识模块 print()函数,函数名称突出为蓝色,输出括号内的变量或者字符创. 变量名的命名:尽量小写字母加下划线并且具有良好的描述性, ...
- Mock分页
前后端分离开发时,一般会使用mock. 因为mock是用node运行的,行为与调用后台一致. 这样,不需要等后台写好,只要有接口文档,前端可以自己调接口,这样联调时遇到的问题会少很多,可以加快整体开发 ...
- 获取字符串指定字符的第n次出现位置
create function uf_findx (@text nvarchar(max),@find_x varchar(200),@find_n int)returns intasbegin -- ...
- 时间序列知识图谱-《利用Python进行数据分析》
所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载或者右击保存图片. 其他章 ...
- spring-cloud-alibaba-sentinel和feign配合使用,启动报Caused by: java.lang.AbstractMethodError: com.alibaba.cloud.sentinel.feign.SentinelContractHolder.parseAndValidateMetadata(Ljava/lang/Class;)Ljava/util/List
背景 我在学习spring-cloud-alibaba技术栈期间,在学习服务熔断与限流的时候,服务启动发生了以下异常 #这是控制台最上面的 sun.misc.Unsafe.park(Native Me ...
- 2020想学习JAVA的同学看过来,最基础的编程CRUD你会了没?
一 JDBC简介 Java DataBase Connectivity Java语言连接数据库 官方(Sun公司)定义的一套操作所有关系型数据库的规则(接口) 各个数据库厂商去实现这套接口 提供数据库 ...
- ffmpeg获取视频封面图片
ffmpeg百度云盘下载地址:https://pan.baidu.com/s/1Am_x0abBvXTrbCFPHs5e9Q 提取码:4y2r /** * ffmpeg百度云盘下载地址:https:/ ...
- Springboot 多数据源配置,结合tk-mybatis
一.前言 作为一个资深的CRUD工程师,我们在实际使用springboot开发项目的时候,难免会遇到同时使用多个数据库的情况,比如前脚刚查询mysql,后脚就要查询sqlserver. 这时,我们很直 ...
- pandas_使用透视表与交叉表查看业绩汇总数据
# 使用透视表与交叉表查看业绩汇总数据 import pandas as pd import numpy as np import copy # 设置列对齐 pd.set_option("d ...
- PHP date_default_timezone_get() 函数
------------恢复内容开始------------ 实例 返回默认时区: <?phpecho date_default_timezone_get();?> 运行实例 » 定义和用 ...