链接:https://www.nowcoder.com/questionTerminal/0c16f758949f4d17ab73a9a1ffe7ab9b
来源:牛客网
牛家庄幼儿园为庆祝61儿童节举办庆祝活动,庆祝活动中有一个节目是小朋友们围成一个圆圈跳舞。牛老师挑选出n个小朋友参与跳舞节目,已知每个小朋友的身高h_i。为了让舞蹈看起来和谐,牛老师需要让跳舞的圆圈队形中相邻小朋友的身高差的最大值最小,牛老师犯了难,希望你能帮帮他。
如样例所示:
当圆圈队伍按照100,98,103,105顺时针排列的时候最大身高差为5,其他排列不会得到更优的解
输入描述:
输入包括两行,第一行为一个正整数n(3 ≤ n ≤ 20) 第二行为n个整数h_i(80 ≤ h_i ≤ 140),表示每个小朋友的身高。
输出描述:
输出一个整数,表示满足条件下的相邻小朋友身高差的最大值。
示例1
输入
4 100 103 98 105
输出
5
解题思路:将第偶数个大的数据从后往前放置,第奇数个大的数据从前往后放置,然后依次计算第i和(i+1)%数组长度的差,取最大值。
package BiShiTi;
import java.util.Arrays;
import java.util.Scanner;
public class m_0011 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = Integer.parseInt(scan.nextLine());
String h_i_Str = scan.nextLine();
String[] h_i_Arr = h_i_Str.split(" ");
int[] h_i = new int[n];
for (int i = 0; i < n; i++) {
h_i[i] = Integer.parseInt(h_i_Arr[i]);
}
int maxDValue = getMaxDValue(n, h_i);
System.out.println(maxDValue);
}
static int getMaxDValue(int n, int[] h_i) {
// 原始数据排序
Arrays.sort(h_i);
// 右边放第偶数个大的数据,左边放第奇数个大的数据
int[] sorted_H_I_Arr = new int[n];
int left = 0;
int right = n - 1;
for (int i = n - 1; i >= 0; i--) {
if (i % 2 == 0) {
sorted_H_I_Arr[right] = h_i[i];
right -= 1;
} else {
sorted_H_I_Arr[left] = h_i[i];
left += 1;
}
}
// 一次计算i和i+1位置的差,并取最大值
int maxDValue = -1;
for (int i = 0; i < n; i++) {
int value = Math.abs(sorted_H_I_Arr[i] - sorted_H_I_Arr[(i + 1) % n]);
if (value > maxDValue) {
maxDValue = value;
}
}
return maxDValue;
}
}