题目描述
有一个长为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;
}