题目的要求是时间复杂度O(n),空间复杂度O(1).
两个错误的思路要避免,一是数组排序,最好的排序算法时间复杂度也是nlogn,明显达不到要求。另外一个是遍历数组求得最大值和最小值,然后相减,但照顾不到i<=j的条件。
正确的思路是对上述第二个算法的改进,将数组第一个元素设置为最大和最小值(i=j=0),最大差值的初始值max就是0,然后移动j,每次移动都计算a[j]-a[i],如果结果大于max就替换max,小于的话什么都不做,而如果结果小于0,则将i赋值为j,继续上面的操作。最终得到的结果就是正确答案。
java实现的代码如下
public class MaxSubtractValueOfArrays {
//Find the max value of elements subtract when i <= j
public static int getMaxSubtractValueofArrays(int a[]){
int i = 0;
int max = 0;
for(int j = 1; j < a.length ; j++){
int sub = a[j] - a[i];
if(sub > max)
max = sub;
else if(sub < 0){
i = j;
}
}
return max;
}
public static void main(String[] args) {
int a[] = {6,18,3,98,67,24,0,43,17,17,67,81,49,-15,9};
int max = MaxSubtractValueOfArrays.getMaxSubtractValueofArrays(a);
System.out.println(max);
}
}