给定一个整数数组 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]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这个题目相对来说还是比较简单,看到之后就会有思路,但是开始的时候写出来的代码在Leecode中通过后发现运行速度和空间消耗比较大,在经过几次优化之后才满意
第一次解法:
class Solution {
public int largestSumAfterKNegations(int[] A, int K) {
int min = getMin(A);
int sum = 0;
while (K != 0){
if (A[min] > 0){
for (int i = 0; i < K; i++) {
A[min] = -A[min];
K--;
}
}else if (A[min] < 0){
A[min] = -A[min];
K--;
min = getMin(A);
}else {
for (int i = 0; i < K; i++) {
A[min] = -A[min];
K--;
}
}
}
for (int i : A) {
sum += i;
}
return sum;
}
public int getMin(int[] A){
int min = A[0];
int temp = 0;
for (int i = 1; i < A.length; i++) {
if (A[i] < min){
min = A[i];
temp = i;
}
}
return temp;
}
}
第二次解法:后来发现上述解法中,自己定义的寻找最小值的方法太慢以及当最小值大于等于0时的for循环是不必须的
class Solution {
public int largestSumAfterKNegations(int[] A, int K) {
Arrays.sort(A);
int min = 0;
int sum = 0;
while (K != 0){
if (A[min] > 0){
if (K % 2 == 1){
A[min] = -A[min];
K = 0;
}else {
K = 0;
}
}else if (A[min] < 0){
A[min] = -A[min];
K--;
//这里不需要排序,第一个数后面的已经是顺序的
if (min <= A.length-1 && A[min] > A[min + 1]){
min++;
}
}else {
//最小值等于0,0取反还是0
K = 0;
}
}
for (int i : A) {
sum += i;
}
return sum;
}
}