• 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));
        }
    }
  • 相关阅读:
    mysql使用笔记
    js this指向练习题
    for in 和for of的区别
    ES6 Iterator(迭代器或遍历器)和 Generator (生成器)
    vue兄弟之间传值 bus中央事件总线
    关于recycleview 滑动item变长(item变形)问题
    蓝牙篇
    如何限制应用安装,
    网络工具,通过该类可以直接监听网络状态改变
    MyRecycleView带有上拉加载更多
  • 原文地址:https://www.cnblogs.com/sykline/p/12241688.html
Copyright © 2020-2023  润新知