LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)

给定一个整数数组 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]。

这个题其实就是考虑最小值的情况,其他的都好说。代码有注释,很好理解。

import java.util.*;
public class test0310 {
	public static void main(String[] args) {
		Solution S = new Solution();
		int[] A = new int[] { 2, -3, -1 , 5, -4};
		int K = 2;
		int sum = S.largestSumAfterKNegations(A, K);
		System.out.println(sum);
	}
}

class Solution {
    public int largestSumAfterKNegations(int[] A, int K) {
        Arrays.sort(A);
        if(A[0] == 0){
        	//如果最小值为 0,那么直接返回数组总和
            return sum(A);
        }else if(A[0] > 0){
        	//如果最小值大于 0,那么只需要在最小值上取反
            while(K > 0){
                A[0] = -A[0];
                K--;
            }
            return sum(A);
        }else{
        	//如果有负数,那么需要先找出最小值,然后取反。
             while(K > 0){
                 A[min(A)] = -A[min(A)];
                 K--;
             }
        }
        return sum(A);
        
    }
    public int sum(int[] A){
    	//数组求和
        int count = 0;
        for(int i = 0 ;i < A.length ; i++){
            count += A[i];
        }
        return count;
    }
    public int min(int[] A){  
    	//找出数组中的最小值 ,返回其下标
        int min = A[0];
        int a = 0;
		for(int i = 1; i < A.length; i++){
            if(min > A[i]){
                min = A[i];
                a = i;
            }
		}
        return a;
    }
}

 

你可能感兴趣的:(LeetCode,Java练习)