[算法][面试题]疯狂队列-排列使得序列两两间“差值的绝对值“之和最大
题目
给定一个数列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 - nums[mid:][0]
if 奇数:res += nums[:mid][-1] # 补正前一半的最后一项
elif 偶数:res -= nums[mid:][1]
python题解
def cal(nums):nums.sort() # 先排个升序mid = len(nums) // 2less, great = nums[:mid], nums[mid:]return 2 * (sum(great) - sum(less)) - great[0] - (great[1] if len(nums) & 1 else -less[-1])
进阶:如何找出一个满足题设的序列?
- 先求出最大值
- 使用回溯法深搜
def rebuild(nums):max_r = cal(nums) # 得到最大的两两间差的绝对值之和n = len(nums)def cal_sum(track):res = 0for i in range(len(track)-1):res += abs(nums[track[i]] - nums[track[i+1]])return resdef backtrack(track=[]):if len(track) == n:if cal_sum(track) == max_r:return [nums[i] for i in track]else:return Nonefor i, _ in enumerate(nums):if i not in track:track.append(i) # track存的是填入的索引res = backtrack(track)if res: # 找到一个即退出return restrack.pop()return Nonereturn backtrack()
[算法][面试题]疯狂队列-排列使得序列两两间“差值的绝对值“之和最大相关推荐
- 编程笔试(解析及代码实现):序列重排之给一个长度为n的序列A,求找出某种排列方式使得相邻两个数的差值之和最大并求出该最大值
编程笔试(解析及代码实现):序列重排之给一个长度为n的序列A,求找出某种排列方式使得相邻两个数的差值之和最大并求出该最大值 目录 题目描述 代码实现 题目描述 序列重排:给一个长度为n的序列A,求找出 ...
- 网易笔试题-疯狂的队列
题目 小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列.有一次,n个学生在列队的时候,小易老师正好去卫生间了.学生们终于有机会反击了,于是学生们决定 ...
- 数据结构与算法笔试题吐血整理
数据结构试题及答案 一.单项选择题 (1) 一个算法应该是(B ). A) 程序 ...
- 算法总结——栈与队列
算法总结--栈与队列 一.栈与队列理论基础 用栈实现队列 Python版本 三.用队列实现栈 Python版本 四.有效的括号 Python版本 五.删除字符串中的所有相邻重复项 Python版本 六 ...
- java 算法笔试题_【干货】经典算法面试题代码实现-Java版
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...
- 回溯算法团灭子集、排列、组合问题
回溯算法团灭子集.排列.组合问题 一.子集 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] ...
- 《网易编程题》疯狂队列
小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列.有一次,n个学生在列队的时候,小易老师正好去卫生间了.学生们终于有机会反击了,于是学生们决定来一次 ...
- 【数据结构与算法】栈与队列
栈 一.什么是栈? 1.后进者先出,先进者后出,这就是典型的"栈"结构. 2.从栈的操作特性来看,是一种"操作受限"的线性表,只允许在端插入和删除数据. 二.为 ...
- 数据结构上机实践第七周项目1 - 自建算法库——顺序环形队列
自建算法库--顺序环形队列 本次实践将建立顺序环形队列的算法库,用于之后的工程中 实现源代码如下: 1.squeue.h /* copyright (t) 2017,烟台大学计算机学院 *All ri ...
最新文章
- 【怎样写代码】实现对象的复用 -- 享元模式(三):享元模式
- linux c语言工具,Linux下C语言编程环境的工具.doc
- Egret之eui.Scroller
- oracle 概要文件不存在,oracle 概要文件 - kecy1217的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- java系统教程_Java 教程(开发环境配置+基础语法)
- hdu4280(最大流)
- JAVA中构造器和方法的区别点
- JDK11的新特性:HTTP API和reactive streams
- 如何将SAP Spartacus的默认home页面替换成login页面 - ProtectedRoutesService
- linux下单点故障的软件,KeepAlived防止单点故障
- 计算机基础第1次作业,计算机应用基础 第一次作业
- Eclipse用法和技巧十一:分栏显示
- linux修改ip配置文件_SSH连接Linux主机进行开发
- 3,graph语法学习
- 计算机基本技能试题,计算机基本技能测试题(第一套).docx
- 文华财经多个非常实用的期货指标公式,文华财经支撑压力自动画线公式
- 中文简体与繁体的转换
- 通证与区块链:前台经济+后台技术
- VB编程:UCase转大写,LCase转小写-4
- Android Lint代码检查实践