通过重新排列数组来最大化数组绝对差的总和

Posted

技术标签:

【中文标题】通过重新排列数组来最大化数组绝对差的总和【英文标题】:maximize summation of absolute difference of array by rearranging the array 【发布时间】:2016-09-26 13:52:10 【问题描述】:

summation of the absolute differences between every two adjacent numbers is maximum 的方式排列给定数组

数组=( 1, 2, 7) 安排是(1,7,2)

sum=|1-7|+|7-2|=11

【问题讨论】:

请说明您的尝试以及您遇到的问题 【参考方案1】:

你可以在 O(nlogn) 中这样做。三思而后行......

    对数组排序 1 2 3 4 5

    选择left=5 right=5,即最大值。 i 为 1,j 为 4,i 给出最大绝对差,所以

    1-5 ==> sum+=|5-1|==>4

    根据最大绝对差异在其右侧或左侧附加。这里它在右侧与 i

    1-5-2 ==> sum+=|5-2|==>7

    现在 left=1 和 right=2 和 4 给出了与 left so 的最大差异

    4-1-5-2 ==> sum+=|4-1|==> 10

    3 左右的差别终于一样了

    3-4-1-5-2 或 4-1-5-2-3 ==> sum+=1==> 11

代码:-(C++)

sort(a.begin(),a.end());
int l=a[a.size()-1]; //left
int r=l;             // right
int i=0,j=a.size()-2;
long long int sum=0;
while(i<j)
        int li=abs(l-a[i]),ri=abs(r-a[i]);
        int lj=abs(l-a[j]),rj=abs(r-a[j]);
        if(li>ri||lj>rj) //left side
                if(li>lj)
                        sum+=li;
                        l=a[i++];
                else
                        sum+=lj;
                        l=a[j--];
                
        else
                if(ri>rj)
                        sum+=ri;
                        r=a[i++];
                else
                        sum+=rj;
                        r=a[j--];
                
        
        //cout<<l<<"---"<<r<<"------"<<i<<"---"<<j<<"----------"<<sum<<endl;

sum+=MAX(abs(l-a[i]),abs(r-a[i]));
cout<<sum<<endl;

【讨论】:

【参考方案2】:

因为你没有包括你的尝试和你的思考过程,所以直接帮助你解决问题是错误的。但是,我可以让你开始..

提示: 以某种方式排列数组可以解决很多问题。例如,如果数组以某种方式排列,您可以从中快速选择最大值和最小值,那么生活就很容易了。

每两个相邻数的绝对差之和最大

绝对差是指相邻的数字在数轴上应尽可能远离。当然,数组中可能的最大差异是最大数字和最小数字之间的差异。因此,它们需要重新排列相邻。剩下的数组也有一个最大值和一个最小值,所以你可以对所有重复上述步骤。

试试这个,如果你在某个地方卡住了就回来......

【讨论】:

【参考方案3】:

这是在 O(nlogn) 时间内完成的排序。

int main()
 
 int n;
 cin>>n;  
 ll arr[n];
for(int i=0;i<n;i++)
  cin>>arr[i];
sort(arr,arr+n);
ll i=0,j=n-1,sum=0;
while(i<j)
 sum+= abs(arr[j]-arr[i]);
 i++;
 sum+= abs(arr[j]-arr[i]);
 j--;

cout<<sum<<endl;

【讨论】:

以上是关于通过重新排列数组来最大化数组绝对差的总和的主要内容,如果未能解决你的问题,请参考以下文章

1846. 减小和重新排列数组后的最大元素贪心算法

数组中 N 个元素的绝对差的最大和

LeetCode 218. 天际线问题(扫描线)/ 1818. 绝对差值和/ 1846. 减小和重新排列数组后的最大元素

通过重新排列列表构建可能的最大数字

LeetCode 1470. 重新排列数组 / 654. 最大二叉树 / 998. 最大二叉树 II

LeetCode 1470. 重新排列数组 / 654. 最大二叉树 / 998. 最大二叉树 II