问题描述 小M在整理桌子上的装饰品时,发现高度差异过大的装饰品放在一起会显得不美观。她希望通过交换装饰品的位置,使得它们的高度变化更加平滑,从而最小化整体的丑陋值。装饰品的丑陋值定义为相邻装饰品高度差的绝对值之和。小M可以任意交换装饰品的位置,目标是找到一种装饰顺序,使得丑陋值达到最小。 例如:当三个装饰品的高度分别为 3, 1, 2 时,通过交换它们的顺序,可以将高度排列为 1, 2, 3,此时丑陋值为 |1-2| + |2-3| = 2,这是最优解。 测试样例 样例1: 输入:n = 3, a = [3, 1, 2] 输出:2 样例2: 输入:n = 5, a = [10, 20, 30, 5, 15] 输出:25 样例3: 输入:n = 4, a = [100, 200, 50, 150] 输出:150 解题思路 排序:对输入的高度数组进行排序。 计算丑陋值:计算排序后数组的相邻元素的高度差之和。 代码提示 你可以按照以下步骤来实现代码: 排序数组:使用 Arrays.sort() 方法对数组进行排序。 计算相邻元素的高度差之和:遍历排序后的数组,计算相邻元素的高度差,并累加这些差值。 代码框架 以下是代码的框架,关键步骤用注释标出: java import java.util.Arrays;public class Main { public static int solution(int n, int[] a) { // Step 1: Sort the array Arrays.sort(a); // Step 2: Calculate the sum of absolute differences of adjacent elements int uglyValue = 0; for (int i = 1; i < n; i++) { // Calculate the absolute difference between adjacent elements uglyValue += Math.abs(a[i] - a[i - 1]); } return uglyValue; } public static void main (String[] args) { System.out.println (solution(3, new int []{3, 1, 2}) == 2); System.out.println (solution(5, new int []{10, 20, 30, 5, 15}) == 25); System.out.println (solution(4, new int []{100, 200, 50, 150}) == 150); }} 关键步骤解释 排序数组:Arrays.sort(a); 这行代码会对数组 a 进行排序。 计算丑陋值:通过遍历排序后的数组,计算相邻元素的高度差,并累加这些差值。 通过排序来最小化丑陋值的思路是基于以下观察:
解题思路
- 排序:对输入的高度数组进行排序。排序后,数组中的元素会按照从小到大的顺序排列。
- 计算丑陋值:计算排序后数组的相邻元素的高度差之和。由于数组已经排序,相邻元素的高度差会尽可能小,从而使得整体的丑陋值最小。
详细解释
- 排序的作用:排序后,数组中的元素会按照从小到大的顺序排列。这样,相邻元素的高度差会尽可能小,因为排序后的数组中,相邻元素的高度差是所有可能排列中最小的。
- 计算丑陋值:排序后,计算相邻元素的高度差之和。由于排序后的数组中,相邻元素的高度差最小,因此计算出的丑陋值也会最小。
示例
假设输入的高度数组为 [3, 1, 2]:
-
排序:排序后的数组为
[1, 2, 3]。 -
计算丑陋值:计算相邻元素的高度差之和:
|1 - 2| = 1|2 - 3| = 1- 丑陋值为
1 + 1 = 2
结论
通过排序,我们可以确保相邻元素的高度差最小,从而使得整体的丑陋值最小。这是因为在排序后的数组中,相邻元素的高度差是所有可能排列中最小的。
代码实现
以下是代码的实现,关键步骤用注释标出:
java
import java.util.Arrays;
public class Main {
public static int
solution(int n, int[]
a) {
// Step 1: Sort the
array
Arrays.sort(a);
// Step 2:
Calculate the sum
of absolute
differences of
adjacent elements
int uglyValue = 0;
for (int i = 1; i <
n; i++) {
// Calculate
the absolute
difference
between
adjacent
elements
uglyValue +=
Math.abs(a[i] -
a[i - 1]);
}
return uglyValue;
}
public static void main
(String[] args) {
System.out.println
(solution(3, new int
[]{3, 1, 2}) == 2);
System.out.println
(solution(5, new int
[]{10, 20, 30, 5,
15}) == 25);
System.out.println
(solution(4, new int
[]{100, 200, 50,
150}) == 150);
}
}
关键步骤解释
- 排序数组:
Arrays.sort(a);这行代码会对数组a进行排序。 - 计算丑陋值:通过遍历排序后的数组,计算相邻元素的高度差,并累加这些差值。
通过排序,我们可以确保相邻元素的高度差最小,从而使得整体的丑陋值最小。