# 题目描述
小红拿到了一个长度为 n 的数组,她定义数组的 ”陡峭值“ 为相邻两数之差的绝对值之和
例如,对于数组 [1, 3, 1, 4, 2] 而言,其陡峭值为 2 + 2 + 3 + 2 = 9
现在小红定义f(i) 为,只修改第 i 个元素的情况下,数组可以达成的最小陡峭值
请你输出每个 f(i) 的值
# 测试用例
- 输入: 3
- 输入:1 2 1
- 输出:1 0 1
说明:
- 若将第一个元素修改为2,数组变成[2,2,1],陡峭值为1。
- 若将第二个元素修改为1,数组变成[1,1,1],陡峭值为0。
- 若将第三个元素修改为2,数组变成[1,2,2],陡峭值为1。
- 可以证明,以上修改的方案得到的陡峭值是最小的。
# 思路
模拟遍历即可
# 代码实现
var __readline = require("readline-sync");
__readline.setDefaultOptions({ prompt: "" });
var readline = __readline.prompt;
console.log("请输入数组长度n: ");
const n = parseInt(readline());
console.log("请输入数组arr: (空格隔开)");
const arr = readline()
.split(" ")
.map((item) => parseInt(item));
function test(arr, n) {
let cnt = 0;
// 计算数组总的陡峭值
for (let i = 1; i < n; i++) {
cnt += Math.abs(arr[i] - arr[i - 1]);
}
let res = [];
for (let i = 0; i < n; i++) {
// 数组两端位置特殊考虑
// 将当前位置与下一个位置的陡峭值减去 比如 1 2, 最小情况是 2 2
if (i === 0) {
res[i] = cnt - Math.abs(arr[i] - arr[i + 1]);
} else if (i === n - 1) {
res[i] = cnt - Math.abs(arr[i] - arr[i - 1]);
} else {
let gap =
Math.abs(arr[i - 1] - arr[i]) +
Math.abs(arr[i] - arr[i + 1]) -
Math.abs(arr[i - 1] - arr[i + 1]);
res[i] = cnt - gap;
}
}
return res.join(" ");
}
console.log("结果为: ", test(arr, n));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43