LeetCode1005 K次取反后最大化的数组和(贪心+Java简单排序)

Posted sykline

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode1005 K次取反后最大化的数组和(贪心+Java简单排序)相关的知识,希望对你有一定的参考价值。

题目:

给定一个整数数组 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));
    }
}

 

以上是关于LeetCode1005 K次取反后最大化的数组和(贪心+Java简单排序)的主要内容,如果未能解决你的问题,请参考以下文章

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

Leetcode刷题100天—1005. K 次取反后最大化的数组和( 数组)—day78

Leetcode刷题100天—1005. K 次取反后最大化的数组和( 数组)—day78

LeetCode1005 K次取反后最大化的数组和(贪心+Java简单排序)

LeetCode 1005[贪心] K次取反后最大化的数组和 HERODING的LeetCode之路

LeetCode 1005. Maximize Sum Of Array After K Negations (K 次取反后最大化的数组和)