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:
cost
will 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 ...
随机推荐
- OSCP Learning Notes - Scanning(1)
TCP vs UDP TCP: Connection-oriented Suited for applications that require high reliablity[HTTP, FTP,T ...
- 信不信?各种红包App最后都会整合游戏!App+游戏的变现模式分析
最近两个月「晓衡在线猿码微服」商城上出现了一类需求特别的客户: 我们有个 App,日活用户达到 XXX万,计划在 App 中嵌入游戏增加用户留存和利用流量变现,还有... 看你们这里游戏不少,想了解一 ...
- vue邪道玩法 : 把vue实例存在别的地方,以及可能会遇到的问题
一般来说,VUE项目中,this指向VUE实例. 但有的时候,某些代码会改变this的指向. 这时,可以用一个临时变量存储VUE实例. test1(){ var _this = this // 把vu ...
- ElementUI 级联选择框 设置最后一级可选及相关问题解决
在使用 elementUI 的 el-cascader 级联选择框进行省市联动效果时,有这么一个需求:该级联选择框一共有三级结构分别为国家-省份-城市,国家和省份为必选项,城市为可选项.具体实现如下: ...
- Python过滤掉numpy.array中非nan数据实例
代码 需要先导入pandas arr的数据类型为一维的np.array import pandas as pd arr[~pd.isnull(arr)] 补充知识:python numpy.mean( ...
- liunx安装和部署nacos配置中心
1.下载https://github.com/alibaba/nacos/releases nacos-server-1.3.1.tar.gz 源码包2.上传到liunx服务器 /usr/lo ...
- HTTP的实体数据
数据类型表示实体数据的内容是什么,使用的是MIME type,相关的头字段是Accept和Content-Type: text:即文本格式的可读数据,我们最熟悉的应该就是text/html ...
- Python(set/list/dict/tuple)
set集合:set是一个无序,不重复元素的集合.可嵌套列表,字典(可以for循环或者迭代的对象). ######差集: a={11,22} b={22,33} c=a.difference(b) #a ...
- Redis服务之常用配置(一)
上一篇博客聊了下redis的简介以及redis的yum安装和源码编译安装需要注意到问题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13378138.html ...
- PHP fwrite() 函数
定义和用法 fwrite() 函数将内容写入一个打开的文件中. 函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止运行. 如果函数成功执行,则返回写入的字节数.如果失败,则返回 FA ...