请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值。给定一个整数数组A和数组的大小n,请返回最大差值。保证数组元素个数大于等于2小于等于500。
测试样例:[9,3,1,10],4
返回:6
方法一:数组下标法
解析:根据题意,我们可以先定义一个一维数组存储数据,然后通过sort进行由小到大排序,再通过for语句两两算出差值,并将其存储到新的一维数组中,最后将存储差值的数组利用sort进行由小到大排序,所得的最后一个元素就是要求解的最大差值。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,solve;
cin>>n;
int a[n],b[n-1];
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
for(int i=0;i<n;i++)
b[i]=a[i+1]-a[i];
sort(b,b+n-1);
cout<<b[n-1]<<endl;
return 0;
}
方法二:最大初值法
解析:根据题意,我们可以定义一个一维数组的容器存储数据,调用findMaxDivision函数,即先将数据由小到大排序,因排序后后一项减前一项大于等于0则定义一个变量初始化为0,然后用for语句循环,利用if语句判断差值是否大于给定的变量,如果大于则赋值给变量,由此找到最大的差值,从而输出其值。
代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int findMaxDivision(vector<int> A, int n)
{
sort(A.begin(),A.end());
int max=0;
for(int i=1;i<n;i++)
if(max<A[i]-A[i-1])
max=A[i]-A[i-1];
return max;
}
int main()
{
vector<int> a;
int n,temp;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>temp;
a.push_back(temp);
}
cout<<findMaxDivision(a,n)<<endl;
return 0;
}