题目:
给定一个整数数组 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]。
提示:
1 <= A.length <= 10000
1 <= K <= 10000
-100 <= A[i] <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations
思路:
贪心。设给出的数组A中负数的个数为flag,
在flag <= K的情况下,我先用flag次机会将所有的负数都变成正数,剩下的K-flag次机会如果是偶数的话,总能维持所有的数为正数;剩下的K-flag次机会如果是奇数的话,就将所有的正数从大到小排序,将最小的变成负数,此时最终的结果的和最大。
在flag > K的情况下,将原数组A从小到大排序,将前K个数字变成正数,然后取和就是最终的结果。
代码:
import java.util.*;
import java.math.*;
/*class Mysort implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
}*/
/*
5 6 9 -3 3
K = 2
-2 5 0 2 -2
K = 3
*/ class Solution {
public int largestSumAfterKNegations(int[] A, int K) {
Arrays.sort(A);
int flag = 0, sum = 0;
for(int i=0; i<A.length; i++){
if(A[i] < 0) flag++;
}
if(flag <= K){
if((K-flag) % 2 == 0){
for(int i=0; i<A.length; i++){
sum += Math.abs(A[i]);
}
}else{
for(int i=0; i<A.length; i++){
A[i] = Math.abs(A[i]);
sum += A[i];
}
Arrays.sort(A);
sum -= 2*Math.abs(A[0]);
}
}else{
for(int i=0; i<K; i++){
sum += Math.abs(A[i]);
}
for(int i=K; i<A.length; i++){
sum += A[i];
}
}
return sum;
}
}
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
Solution solution = new Solution();
int n = scanner.nextInt();
int[] chips = new int[n];
for(int i=0; i<n; i++){
chips[i] = scanner.nextInt();
}
int K = scanner.nextInt();
System.out.println(solution.largestSumAfterKNegations(chips,K));
}
}