题目:
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)
以这种方式修改数组后,返回数组可能的最大和。
示例 1:
输入:A = [4,2,3], K = 1
输出:5
解释:选择索引 (1,) ,然后 A 变为 [4,-2,3]。
示例 2:
输入:A = [3,-1,0,2], K = 3
输出:6
解释:选择索引 (1, 2, 2) ,然后 A 变为 [3,1,0,2]。
示例 3:
输入:A = [2,-3,-1,5,-4], K = 2
输出:13
解释:选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]。
思路一:
要想每次A中和最大,每次取反肯定要是A中最小的数。
循环K次,每次先排序数组,A[0]=-A[0]。最后对A求和。
代码如下:
public int largestSumAfterKNegations(int[] A, int K) {
for (int i = 1; i <= K; i++) {
Arrays.sort(A);
A[0] = -A[0];
}
int sum = 0;
for (int a : A) {
sum += a;
}
return sum;
}
思路二:
先排序数组
第一步:遍历数组,尽可能多的负数变正数,K--
第二步:数组此时的情况,要么都是正数,要么K>0,再排序数组
第三步:判断K是奇数还是偶数,如果是奇数,数组中最小值变为负数。
第四步:A求和。
代码如下:
public int largestSumAfterKNegations1(int[] A, int K) {
Arrays.sort(A);
for (int i = 0; i < A.length; i++) {// 负数变正数
if (A[i] < 0 && K > 0) {
K--;
A[i] = -A[i];
}
}
// 这时,A中要么全是正数,要么k<=0
// 计算K剩余值,如果未偶数则直接求和,为奇数,绝对值最小数取反再求和
Arrays.sort(A);
if (K % 2 == 1) {
A[0] = -A[0];
}
int sum = 0;
for (int n : A) {
sum += n;
}
return sum;
}
-------------------------------小白学算法