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

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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值