「每日LeetCode」2021年7月25日

本文最后更新于:2023年3月19日 晚上

Lt1005. K 次取反后最大化的数组和

1005. K 次取反后最大化的数组和

给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)
以这种方式修改数组后,返回数组可能的最大和。
 示例 1:

1
2
3
输入:A = [4,2,3], K = 1
输出:5
解释:选择索引 (1,) ,然后 A 变为 [4,-2,3]。

示例 2:

1
2
3
输入:A = [3,-1,0,2], K = 3
输出:6
解释:选择索引 (1, 2, 2) ,然后 A 变为 [3,1,0,2]。

示例 3:

1
2
3
输入:A = [2,-3,-1,5,-4], K = 2
输出:13
解释:选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]。

提示:

  1. 1 <= A.length <= 10000
  2. 1 <= K <= 10000
  3. -100 <= A[i] <= 100

思路

sort 后,把第一个元素置反,然后重新插入数组中,维护一个小顶堆,直到 K 为 0 求和即可。

解答

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
/**
* @param {number[]} A
* @param {number} K
* @return {number}
*/
var largestSumAfterKNegations = function (A, K) {
A.sort((a, b) => a - b);
while (K > 0) {
A[0] = -A[0];
let i = 1;
for (i = 1; i < A.length; i++) {
const next = A[i];
if (next > A[0]) {
A.splice(i, 0, A[0]);
A.shift();
break;
}
}
if (i === A.length) {
A.splice(i + 1, 0, A[0]);
A.shift();
}
K--;
}
return A.reduce((a, b) => a + b);
};