贪心算法爬楼梯问题--LeetCode746《Blind-Stab》

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)的必然有规律,我们要去找到这根规律线。就这题来说,要求最小,你得每次都最小,那我们就去求每次都最小的,怎么求,我就从第一个开始。。。。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值