leetcode网第746号题:题目如下

数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始)。

每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。

您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs

这道题刚开始看得我有点懵逼,想了一会想出解法来了,下面我们就来分析一下!

分析:

1,题目的意思是求最小体力花费,给了你一个数组,数组里面的值不固定,但都是大于0的。

2,你每次可以走一个楼梯,或者两个楼梯,但是上楼梯要花费该楼梯对应的体力值,最终走完,求最小。

3,也就是说我们每次都选择最优路径走,最小值肯定唯一。

4,我们用以大化小法想,假设开始n个楼梯,也就是一个数组长度为n,最大值角标为n-1,我们放小这个n

5,假设只有两个楼梯,我们是不是直接找出里面最小的值就行了,一来就到那最小的楼梯上去,这就是最小花费。

6,每一个楼梯从他的上一步走到该楼梯都有两种走法,一种是连续两次走一个楼梯,一种是一下跨上去。

7,而我们要求的就是这两种可能中的最小花费,但是要求到达最顶层的最小花费,我们就得保证每一次都是最小的花费。

8,n个楼梯,第一次,我们能跨到0阶,或者1阶,那么0阶楼梯对应的cost[0]就是到0阶楼梯的最小花费,同理1阶。

9,那么角标为2的2阶楼梯呢,我们是不是可以从0阶或者1阶跨到2阶,所以就要求出当前0阶和1阶位置上哪个花费比较小

10,哪个花费比较小我就从哪个楼梯走,假设是0阶比1阶小,那我就是0-2这样的走法,那么当前走到2阶的方法就是最小花费。

11,同理角标为3的楼梯,他可以从1,或者2跨上去,当前1,2记录下了走到自身楼梯的最小发花费,是不是只要比较两者谁更小就可以了?假设1小,那么就是1-3,,,,依次类推得到n阶

12,也就是说,我需要一个容器来求出并记录每个角标对应的楼梯的最小花费,然后迭代。要到达目标楼梯n,那就要求出走到n-1,和n-2阶楼梯的最小花费,挑出更小的,也就是我们要求出每一个楼梯的最小花费。

13,记录容器[0] = cost[0],   记录容器[1]=cost[1],   记录容器[2] = min(记录容器[0],记录容器[1]) + cost[2]    ,,,,,     记录容器[n] = min(记录容器[n-1],记录容器[n-2]) + cost[n].

14,但是因为n-1,和 n 的下一步都可以结束跨楼,所以我们最后还要min(记录容器[n - 1],记录容器[n-2]).得到的便是答案。

好,接下来我们来写程序!

public class LC746 {public static void main(String[] args) {//模拟楼梯每一阶对应的花费int [] cost = {0,2,2,1,0,1,2,2};//4 //用来记录到达相应下标值的楼梯的最小花费int [] indexMinCost = new int[cost.length];//0,1两个楼梯一来就可以直接跨上去,cost对应值既是最小值//不需要去和哪个楼梯比较大小,因此不进入循环直接赋值indexMinCost[0] = cost[0];indexMinCost[1] = cost[1];//从角标2开始计算每一个楼梯最小花费for (int i = 2; i < indexMinCost.length; i++) {//拿前两个楼梯中最小的加上当前要跨的,就是到当前要跨的这个楼梯的最小花费indexMinCost[i] = Math.min(indexMinCost[i-1], indexMinCost[i-2]) + cost[i];}//当前indexMinCost[]记录的是相应角标阶梯的最小花费//但是由于n-1和n-2的下一步都可以跨完,所以我们还得在比较一次int min = Math.min(indexMinCost[cost.length - 1], indexMinCost[cost.length - 2]);System.out.println("最小花费为:" + min);}
}

总结:

一开始我陷入了误区,认为每次都是两两相比求最小值,其实不是的,应该是求出每个角标对应阶梯的最小值。

解法还是很灵活的,凡是能用到for(1-n)的必然有规律,我们要去找到这根规律线。就这题来说,要求最小,你得每次都最小,那我们就去求每次都最小的,怎么求,我就从第一个开始。。。。

贪心算法爬楼梯问题--LeetCode746《Blind-Stab》相关推荐

  1. 经典算法——爬楼梯(解法归纳)(学习笔记)

    问题分析 假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢?是引用 当n=1时,只需爬一个台阶,就是一种解法. 当n=2时,可以走两次 ...

  2. Java算法——爬楼梯(LeetCode第70题)

    问题描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 示例 分析 题目中给出,上台阶的方式只有两种,一种为一步跨一阶,一种为 ...

  3. 贪心算法---跳楼梯问题

    1.题目 从A点到B点有n阶楼梯,小明现在要从A点到B点,他可以一步迈一个格子,也可以一步迈两个格子,也可以一步迈三个格子,也可以一步迈四个格子.请编写程序计算小明从A点到B点一共有多少种走法. 2. ...

  4. 【每日一算法】爬楼梯

    微信改版,加星标不迷路! 每日一算法-爬楼梯 作者:阿广 阅读目录 ? 题目 ? 解析 ? 完整代码 1 题目 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多 ...

  5. 爬楼梯-斐波那契数列

    每日算法---爬楼梯 题目: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数.示例 1:输入: 2 输 ...

  6. 动态规划算法-01爬楼梯问题

    爬楼梯问题 动态规划 动态规划算法将带求解问题拆分成一系列相互交叠的子问题,通过递推关系定义各子问题的求解策略,并随时记录子问题的解,最终获得原始问题的解,避免了对交叠子问题的重复求解. 在动态规划算 ...

  7. 斐波那契数列-爬楼梯算法

    爬楼梯算法 有n级楼梯,有2种爬法,1次1级,或1次2级,问,n级楼梯有多少种爬法? 递归求解 首先,当只有一阶楼梯的时候,很显然只有一种走法:有两阶楼梯的时候,也很显然的知道有两种走法.就会有下面这 ...

  8. 算法:Climbing Stairs(爬楼梯) 6种解法

    说明 算法:Climbing Stairs(爬楼梯) LeetCode地址:https://leetcode.com/problems/climbing-stairs/ 题目: You are cli ...

  9. 动态规划算法学习(一)爬楼梯和凑金额

    爬楼梯 每步可跨台阶:1,2,3 -该场景表示有序组合 台阶总数:15 求多少种跨法 ''' 倒推下,当我倒数第二步已经走了14.13或12步时,我最后一步就可以就可以走完15个台阶此时我15步的走法 ...

最新文章

  1. HDU - 2767 Proving Equivalences tanjar强连通-DAG性质
  2. unity加载ab后,场景shader不起效问题(物件表现黑色)
  3. uboot 如何设置网关地址_两种网络地址段,如何设置内网和外网一起上?
  4. CentOS7解决配置静态IP还是会出现动态IP地址的问题
  5. Deep Learning 论文笔记 (2): Neural network regularization via robust weight factorization
  6. 10分钟看懂浏览器的渲染过程及优化
  7. 【转】UML基础: 第 2 部分 - 对象图 (Object Diagram)
  8. python自动搜索请求失败_http请求 request失败自动重新尝试代码示例
  9. 每天学一点flash(75) ToolTip 提示
  10. 在Ubuntu 14.04安装和使用Docker
  11. UVA11173 Grey Codes【位操作】
  12. node url模块
  13. python操作excel的读写
  14. 微积分Z2J5 两个重要极限
  15. java软电话_软电话使用呼叫中心的方法与流程
  16. Acer宏基笔记本电脑捕食者Predator PH317-55原装出厂Windows10系统恢复原厂OEM系统
  17. 2020 CCPC - 网络选拔赛 签到计划
  18. 转载:Android (争取做到)最全的底部导航栏实现方法
  19. 信号调制与二极管检波电路的multisim仿真
  20. 云南计算机网络技术专业培训学院,云南哪些大学有计算机网络技术专业

热门文章

  1. 100道动态规划——17 UVA 10934 Dropping water balloons 猜数问题
  2. 培育用户刷脸支付习惯尚需要一段时间
  3. 用C语言实现两个值交换的四种方法
  4. CC2530按键控制LED灯开关
  5. 手机版明日之后无限法则服务器,《明日之后》安卓版服务器被挤爆,玩家吐槽网易没钱买服务器,对此你怎么看?...
  6. 用html制作简单日历,CCS小技巧,如何使用CSS Grid制作简单的日历,简单有趣
  7. 什么塑造了今天的编程世界
  8. ps把bmp图片改成256色
  9. 那些年我们追过的拳皇(r8笔记第37天)
  10. uniapp去掉页面导航左上角的返回按钮