对n个数的序列,n大于4,则一定存在递增的i,j,p,q,满足a[j]-a[i]+a[q]-a[p]的值最大,求这个最大值

问题:对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 <iostream>
#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

猜你喜欢

转载自blog.csdn.net/u013069552/article/details/80993156