求一个数组(a(i,j))中元素相减的最大值,且i

题目的要求是时间复杂度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);
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章