标签: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