牛牛摆放花
牛牛有n朵需要摆放的花,但是每朵花呢,高度都不一样,牛牛不喜欢相邻的花高度相差太多,这样会影响美感。
所以牛牛提出了一个“丑陋度”的概念,“丑陋度”意思为在一个摆放序列中,相邻花高度差的最大值。而且牛牛是一个完美主义者,所以他希望:
1.将这些花摆成首尾相接的圆形
2.为了美观,他希望摆放的花“丑陋度”最小
解题思路:贪心。
时间复杂度 ,空间复杂度
首先我们需要构造出一个序列,使其满足最小的丑陋度,然后再去计算丑陋度的大小。如果想构造一个序列满足相邻花高度差的最小值,我们可以首先把最大数放中间,然后每一次放次小的数在两边,这是没问题的(就是贪心的思想),至于次小的数放左边还是右边,是没有影响的。
根据此贪心思路,首先对该数组进行从小到大排序,然后需要一个辅助数组b来存储我们构造出的序列,序列的存储规则按贪心思路描述的即可。最后计算丑陋度的大小。
注意,题意要满足圆形的序列排列,所以数组最后的元素仍然要与数组的第一个元素进行比较。
/** * 返回按照这些花排成一个圆的序列中最小的“丑陋度” * @param n int整型 花的数量 * @param array int整型vector 花的高度数组 * @return int整型 */ int solve(int n, vector<int> &array) { // write code here if (n == 2) { return abs(array[1] - array[0]); } sort(array.begin(), array.end()); int b[100001]; int l = 0, r = n - 1; for (int i = 0; i < n; i++) { if (i & 1) { b[l++] = array[i]; } else { b[r--] = array[i]; } } int maxx = -1; for (int i = 1; i < n; i++) { maxx = max(maxx, abs(b[i] - b[i - 1])); } maxx = max(maxx, abs(b[n - 1] - b[0])); return maxx; }