牛客(美团)- 最大差值(贪心算法)

题目描述

有一个长为n的数组A,求满足0≤a≤b<n的A[b]-A[a]的最大值。
给定数组A及它的大小n,请返回最大差值。

测试样例:
[10,5],2
返回:0

贪心概念

贪心算法是一种对某些求最优解问题的更简单,更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须消耗的大量时间。

思路

1、如果只有一个元素,很明显最大差值只可能是自己去减自己,即0
2、大于1时,又因为a<=b,即差值是只有后面的减去前面的情况以及自身减自身,不存在前面的元素减后面的元素的情况
3、既然只有后面的元素减前面的,那么我们保持拿到前面的元素集(如果有多个)里最小的那个,再让后面的元素去与之求差值即使这个局部范围内的最优解,而不用考虑用后面的指定元素去减去前面的所有元素。(贪心思想)

代码

public static int getDis(int[] A, int n)
{
	// 如果长度为1,那么最大差值只有自身减自身的情况,也就是0
	if (n == 1) return 0;
		
	int minNum = A[0];	// 先拿到局部范围内的最小元素(从1开始,一开始只有一个元素最小就他)
	int resDis = 0;		// 先给定一个最小的差值(只要有元素哪怕是一个那差值就不可能小于0,最起码有个自身减去自身保底)
		
	// 开始循环,每次使局部范围增加一个元素,并找出新局部最优解。第一次循环增加下标为1的元素
	for (int index = 1; index < n; index++)
	{	// 判断新增一个元素后,先求与最小值的差值能否优于原先的局部最优解
		// 如果优于则新局部最优解更新,否则原局部的解将还是新局部最优解
		if (A[index] - minNum > resDis) resDis = A[index] - minNum;
		// 局部范围扩大后,更新局部范围最小的那个值
		if (A[index] < minNum) minNum = A[index];
	}
	return resDis;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值