[算法][面试题]疯狂队列-排列使得序列两两间“差值的绝对值“之和最大

给定数列A,要求找到一种排序方式,使相邻元素差值绝对值之和最大。通过升序排序,确定高值和低值部分,并考虑数组奇偶性进行修正,以达到最大疯狂值。提供伪码和Python解题思路。
摘要由CSDN通过智能技术生成

题目

给定一个数列A,数列中相邻两项的差值的绝对值定义为“疯狂值”。任意排序这个数列,使得整个数列的“疯狂值”最大,输出这个最大值。

样例

输入

5 10 25 40 25

输出

100

解释:

当队列排列顺序是: 25-10-40-5-25时, 身高差绝对值的总和为15+30+35+20=100。可以有多种排列方案。

题解

首发于此:https://blog.nowcoder.net/n/aee5c4e3c14f48eeb678c6f839a6369b

很显然最终的排序结果必为交叉排布的,且符合[...低 高 低 高...]的形式;
1.所以先对数列升序排序,很容易想到高的部分是数组的后一半,低的部分是数组的前一半。
2.观察[...低1, 高1, 低2, 高2...]的形式,两两间差的绝对值之和=(高1-低1)+(高1-低2)+(高2-低2)
3.假设数组无穷多项,则显然高的那一半每个被加了两次,低的那一半每个被减了两次。
4.但由于数组必然不是无穷多项,必会有断开的。要断开的部分必然在升序数组的中间部分:

  • 4.1 若总项数为偶数,则前一半的最后一个被多减去了一次、后一半的第一个被多加上了一次,需要进行修正。
  • 4.2 若总项数为奇数,后一半的第一个依旧被多加上了一次。可以很清楚的知道前一半会被包在后一半中,即[高...低 高 低 高...高],因此此时前一半没有被多减去一次,但高的一半的第二个又被多加上了一次,因此需要补正。

伪码

nums.sort()
res = (sum(nums[:mid]) - sum(nums[mid:])) * 2 -
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值