面试OR笔试5——最大疯狂值

61 篇文章 0 订阅
61 篇文章 0 订阅

1 题目及要求

1.1 题目描述

n个整数组成的序列表示n个同学的身高。定义疯狂值为他们排成一排相邻同学身高差的绝对值的总和。现要求求出该序列的最大疯狂值。

 

1.2 测试用例

1n = 5, h = [5, 10, 25, 40, 25]

2n = 6, h=[1, 2, 3, 4, 5, 6]

2 解答

2.1 题目分析

题意很明了,就是求序列相邻元素间差值总和的最大值。可以用贪心算法求解:

1)先对序列进行排序,排序后为A = [a1, a2, a3, ……, an];

2)然后先拿出最大和最小的元素放在一起作为相邻的元素,记为B,此时:

B = [a1, an]; A = [a2, a3, a4, ……, an-1];

3)拿出A剩下中的最小和最大元素,分别挨着B的两端的最大和最小元素放;此时:

A = [a3, a4, a5,……, an-2],B = [an-1,a1, an, a2]。

4)循环3,直至A为空。

 

 

2.2 代码

 

int maxDiff(vector<int> &h) {
	int n(h.size());
	if (n < 2) return h[0];
	sort(h.begin(), h.end());
	int lo(1), hi(n - 2), mx(h[n - 1]), mn(h[0]), ret;
	ret = mx - mn;
	while (lo < hi) {
		ret += mx - h[lo] + (h[hi] - mn);
		mx = h[hi];
		mn = h[lo];
		++lo; --hi;
	}
	if (lo == hi) ret += max(mx - h[lo], h[lo] - mn);
	return ret;
}

 

3 测试

因为测试简单,这里只给出运行结果:

1)100

2)17

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值