【问题标题】: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

【问题讨论】:

  • 请说明您的尝试以及您遇到的问题

标签: algorithm sorting language-agnostic


【解决方案1】:

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

  1. 对数组排序 1 2 3 4 5
  2. 选择left=5 right=5,即最大值。 i 为 1,j 为 4,i 给出最大绝对差,所以

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

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

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

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

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

  5. 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 2019-11-03
        • 1970-01-01
        • 2020-09-18
        • 1970-01-01
        相关资源
        最近更新 更多