面试题, 在一个整数数组中,一个数字减去它左边的数字得到一个差值,求最大差值的数字。如 [4,2,7,5,11,13,9,1]
,差值最大为11,是13-2的结果。只能用右边的数字-左边的数字计算差值。
我用php实现的代码,比较暴力,类似于冒泡排序.
$arr = [4,2,7,5,11,13,9,1];
$a = 0;
$b = 0;
for ($i = count($arr) - 1; $i >= 0; $i--) {
for ($j = 0; $j <= $i - 1; $j++) {
$tmp = $arr[$i] - $arr[$j];
if ($tmp > $a) {
$a = $tmp;
$b = $arr[$i];
}
}
}
echo $b;
求一个更优的算法,语言不限。
@Reming 的算法有一个小漏洞, 如果数据是这样的话, 算出来的实际上是有问题的.
个人认为, 这个问题有两个关注点:
但和最大值无关, 我们需要关注的是最大差值, 可能最大值出现的时候, 最小值还没有出现, 而后面出现的数值减去最小值可能反而比较大. 上面的用例就是基于这种逻辑设计出来的.
修改后逻辑为: 向后循环遍历, 记录下到目前为止的最小值 以及 最大差值, 然后计算当前元素-目前为止最小值, 判断大小. 记录最大的差值即可.
基于 @Reming 的代码稍微修改了下:
再补充一句, 实际上这个问题可以这样想:
那么我们可以分两步计算出来最大差值