码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-01-29 23:58:09      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:rri   imp   ips   color   题目   scanner   tps   code   最大   

题目:

给定一个整数数组 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简单排序)

标签:rri   imp   ips   color   题目   scanner   tps   code   最大   

原文地址:https://www.cnblogs.com/sykline/p/12241688.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!