题目出自数据结构与算法分析2.28
常规思路是用两个for循环嵌套,但是时间复杂度会是O(N²)。
然后书中推荐的方法是O(N),先给出思路和代码:
首先最大值的初始值应该是0,当i=j时
要找到a[j]-a[i]的最大值,也就是找到a[j]之前的最小值,所以当下标j向前扫描时,如果相减的值大于当前最大值,则更新最大值,如果相减的值小于0,也就是a[j]小于a[i],此时将最小值设定为当前的a[j],即i=j,然后继续扫描至结束。
整个过程只对数组进行一次扫描,即下标j不断向前。
public class Max
{
public static void main(String[] args){
int[] arr = new int[]{5,2,3,7,4,9,6,2,4,7};
int maxi = arr[0]; //记录j之前最小的a[i]
int maxMinus = 0; //记录最大差值
int a = 0; //记录最大差值的i下标
int b = 0; //记录最大差值的j下标
int temp = 0; //暂存最大差值的i下标
for (int j = 0; j < arr.length ; j++)
{
if ((arr[j] - maxi) > maxMinus) //当小于当前的最大差值时
{
maxMinus = arr[j] - maxi; //更新最大差值
a = temp;
b = j;
}
else if ((arr[j] - maxi) < 0) //当小于当前最小的a[i]时
{
maxi = arr[j]; //更新最小的a[i]
temp = j;
}
}
System.out.println("最大差值是a[" + b + "]-[" + a + "]=" + maxMinus);
}
}