待字闺中之相差最大分析

题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号“待字闺中”

给定无序数组A,在线性时间内找到i和j,j>i,并且保证A[j]-A[i]是最大的。

这个题目是比较简单的。很直接的,对于每一个A[j],如果知道前面的元素中最小的元素min,则此时相差最大为A[j]-min。则,假设有一个数组M,M[j]表示[0,j-1]中最小的元素。这个遍历一边A,就可以完成构造M。再遍历一边数组,就可以找到相差最大的。我们举个例子看看M,以及是否有改进的空间。

假设A={1,2,5,3,4}。通过一次遍历,得到M如下:

1 1 1 1 1

这是一个极端的例子,但确实给了我们一个改进的方向,就是并不需要一个数组保存最小值,而只需要一个变量即可。

上面的例子不明显,假定A={2,5,1,3,4},过程如下:

j A[j] 最小值m A[j]-m
0 2 2 0
1 5 2 3
2 1 1 0
3 3 1 2
4 4 1 3

最终得到相差最大为3.这个例子,可以找到两个i,j。

代码如下:

int maxDiff(vector<int>& data)
{
	int length = data.size();
	if(length <= 1)return 0;
	int i,minValue = data[0],res = numeric_limits<int>::min();
	for(i = 1;i < length;i++)
	{
		res = max(data[i] - minValue,res);
		minValue = min(minValue,data[i]);//更新当前的最小值
	}
	return res;
}


这个题目,如果有的同学给出数组C,C[j]表示[0,j]中的最小值;数组B表示[j+1, n-1]中的最大值;这两个数组遍历两次可以得到,然后,再遍历一次A,对于每一个i,B[i]-C[i]中最大的,就是最终的值。这个思路也是ok的,只不过比我们开始提到的,更加一些,可以通过观察C,B的变化,找到规律,进行化简。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值