一,题目描述
原文链接:力扣https://leetcode-cn.com/problems/min-cost-climbing-stairs/
难度简单709
数组的每个下标作为一个阶梯,第
i
个阶梯对应着一个非负数的体力花费值cost[i]
(下标从0
开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。
请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。
示例 1:
输入:cost = [10, 15, 20] 输出:15 解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。示例 2:
输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 输出:6 解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。提示:
cost
的长度范围是[2, 1000]
。cost[i]
将会是一个整型数据,范围为[0, 999]
。通过次数145,872提交次数245,810
二,解决思想
蹦到第一个阶梯——所需最短为1
蹦到第二个阶梯——所需最短为100
蹦到第三个阶梯——所需最短为1+1=2
蹦到第四个阶梯——所需最短为 第三个阶梯+1 or 第二个阶梯+1 为3
蹦到第五个阶梯——所需最短为 第三个阶梯+1 or 第四个阶梯+1 为3
蹦到第六个阶梯——所需最短为 第四个阶梯+100 or 第五个阶梯+100 为103
蹦到第七个阶梯——所需最短为 第六个阶梯+1=104 or 蹦到第五个阶梯+1=4 为4
蹦到第八个阶梯——所需最短为 5
蹦到第九个阶梯——所需最短为 104
蹦到第十个阶梯——所需最短为 5+1=6
第十一个阶梯才是走出来,所需最短为 第九个阶梯+0 or 第十个阶梯+0 为6
规律:
- 先找出上第一个阶梯和第二个阶梯耗费的体力值,放在那;
- 之后,每一个阶梯耗费的最小体力值=当前阶梯对应的体力值+上一个阶梯和上上一个阶梯比较之后较小的那个的体力值。
- 最后,就可以求出到达最后一个阶梯的下一个阶梯(本身耗费为0)耗费的体力值了;
三,代码
package zyh.springcloud.chapter2.service.impl.algorithm;
/**
* @ClassName MinCostClimbingStairs
* @Author zhangyonghui
* @Description
* @Date 2021/11/16 11:00
* @Version 1.0
**/
public class MinCostClimbingStairs {
public static void main(String[] args) {
int[] ints = new int[]{1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
int out = minCostClimbingStairs(ints);
System.out.println("结果 = " + out);
}
/**
* 蹦到第一个阶梯——所需最短为1
* 蹦到第二个阶梯——所需最短为100
* 蹦到第三个阶梯——所需最短为1+1=2
* 蹦到第四个阶梯——所需最短为 第三个阶梯+1 or 第二个阶梯+1 为3
* 蹦到第五个阶梯——所需最短为 第三个阶梯+1 or 第四个阶梯+1 为3
* 蹦到第六个阶梯——所需最短为 第四个阶梯+100 or 第五个阶梯+100 为103
* 蹦到第七个阶梯——所需最短为 第六个阶梯+1=104 or 蹦到第五个阶梯+1=4 为4
* 蹦到第八个阶梯——所需最短为 5
* 蹦到第九个阶梯——所需最短为 104
* 蹦到第十个阶梯——所需最短为 5+1=6
* 第十一个阶梯才是走出来,所需最短为 第九个阶梯+0 or 第十个阶梯+0 为6
*
* 规律:
* 先找出上第一个阶梯和第二个阶梯耗费的体力值,放在那不用动;
* 之后,每一个阶梯耗费的最小体力值=当前阶梯对应的体力值+上一个阶梯和上上一个阶梯比较之后较小的那个的体力值。
* 最后,就可以求出到达最后一个阶梯的下一个阶梯(本身耗费为0)耗费的体力值了;
* @param cost
* @return
*/
public static int minCostClimbingStairs(int[] cost) {
//遍历数组:
for (int i = 2; i < cost.length; i++) {
int prePreEle = cost[i - 2];
int preEle = cost[i - 1];
int nowEle = cost[i];
cost[i] = (prePreEle < preEle ? prePreEle : preEle) + nowEle;
}
return cost[cost.length - 1] < cost[cost.length - 2] ? cost[cost.length - 1] : cost[cost.length - 2];
}
}