码迷,mamicode.com
首页 > 其他好文 > 详细

待字闺中之相差最大分析

时间:2014-07-21 16:34:02      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:待字闺中   找工作   算法   

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

给定无序数组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的变化,找到规律,进行化简。


待字闺中之相差最大分析

标签:待字闺中   找工作   算法   

原文地址:http://blog.csdn.net/fangjian1204/article/details/38019493

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!