问题:对n个数的序列,n>4,则一定存在i,j,p,q,使得i<j<p<q,并且a[j]-a[i]+a[q]-a[p]的值最大,求这个最大值
思路:申明两个数组left,right分别存储从左侧开始两个数相减的最大值,从右侧开始两个数相减的最大值,最后求解两个数组满足left[i]+right[j]最大,但i<j的最大值。时间复杂度为O(n^2)
#include<string.h>
using namespace std;
int calDiffmax(int *a,int n)
{
int maxval=0;
int sub=0;
int k=0;
for(int i=0;i<n;i++)
{
sub=a[i]-a[k];
if(maxval<sub)
maxval=sub;
else if(sub<0)
{
k=i;//sub<0意味着a[i]<a[k],后续最大值会在a[i]<a[k]
}
}
return maxval;
}
int diff2max(int *a,int n)
{
int *left=new int[n];
int *right=new int[n];
memset(left,0,n);
memset(right,0,n);
//从左存储最大差值
for(int i=1;i<n-2;i++)
{
left[i]=calDiffmax(a,i+1);
}
//从右存储最大差值
for(int i=n-2;i>1;i--)
{
right[i]=calDiffmax(a+i,n-i);
}
/*
for(int i=1;i<n;i++)
{
cout<<left[i]<<endl;
}
cout<<"*********************"<<endl;
for(int i=1;i<n-1;i++)
{
cout<<right[i]<<endl;
}
*/
int max_val=0;
int diff_sum=0;
//寻找满足条件的最i<j左右最大差值
for(int diff_l=1;diff_l<n-2;diff_l++)
{
for(int diff_r=diff_l+1;diff_r<n-1;diff_r++)
{
diff_sum=left[diff_l]+right[diff_r];
if(diff_sum>max_val)
max_val=diff_sum;
}
}
return max_val;
}
int main()
{
int a[10]={1,2,3,4,5,11,12,13,14,15};
cout<<"max value a:"<<diff2max(a,10)<<endl;
int b[10]={1,2,3,7,20,11,12,13,14,15};
cout<<"max value b:"<<diff2max(b,10)<<endl;
return 0;
}
输出结果:
max value a:13
max value b:23