您的位置:首页 > 其它

数组中元素差的最大值

2015-09-12 15:11 274 查看
这道题是2016美团面试题:

1.给定一个数组arr,数组长度为len,求满足 0 <= a <= b < len的 arr - arr[a]最大值。

你的想法:让每一个数字减去它右边的数字,并通过比较得到数对的最大值,时间复杂度(O^2),这应该是面试官不想要的。

[b]解法一:分治法(递归实现)


假设把数组分成两个子数组,用左数组最大的减去右数组最小的,最大值有三种情况:

  (1)被减数和减数都在第一个子数组中,即第一个子数组中的数对之差的最大值;

  (2)被减数和减数都在第二个子数组中,即第二个子数组中数对之差的最大值;

  (3)被减数在第一个子数组中,是第一个子数组的最大值;减数在第二个子数组中,是第二个子数组的最小值。

(1)、(2)、(3)中,这三个差值的最大者就是整个数组中数对之差的最大值。

#include <iostream>
#include <stack>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
int max_find(int arr[],int len)
{
if(arr == NULL || len < 2)
{
return -1;
}
int max = arr[0];
int sum = max - arr[1];//初始化数对差
int i = 0;
for(i = 2;i < len;++i)
{
if(arr[i-1] > max)
{
max = arr[i-1]; //左侧最大值
}
int cur = max - arr[i];//用最大的值减右侧的最小值
if(cur > sum) //判断是否是最大数对之差
{
sum = cur;
}
}
printf("%d",sum);
}
int main()
{
int a[2] = {10,5};
max_find(a,2);
}


View Code

以上三种都是O(n),那么:

第一种:递归,有递归栈

第二种:要n-1辅助数组

第三种:推荐
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: