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]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这个题目相对来说还是比较简单,看到之后就会有思路,但是开始的时候写出来的代码在Leecode中通过后发现运行速度和空间消耗比较大,在经过几次优化之后才满意

第一次解法:

class Solution {
    
    
    public int largestSumAfterKNegations(int[] A, int K) {
    
    
        int min = getMin(A);
        int sum = 0;
        while (K != 0){
    
    
            if (A[min] > 0){
    
    
                for (int i = 0; i < K; i++) {
    
    
                    A[min] = -A[min];
                    K--;
                }
            }else if (A[min] < 0){
    
    
                A[min] = -A[min];
                K--;
                min = getMin(A);
            }else {
    
    
                for (int i = 0; i < K; i++) {
    
    
                    A[min] = -A[min];
                    K--;
                }
            }
        }
        for (int i : A) {
    
    
            sum += i;
        }
        return sum;
    }
    public int getMin(int[] A){
    
    
        int min = A[0];
        int temp = 0;
        for (int i = 1; i < A.length; i++) {
    
    
            if (A[i] < min){
    
    
                min = A[i];
                temp = i;
            }
        }
        return temp;
    }
}

第二次解法:后来发现上述解法中,自己定义的寻找最小值的方法太慢以及当最小值大于等于0时的for循环是不必须的

class Solution {
    
    
    public int largestSumAfterKNegations(int[] A, int K) {
    
    
        Arrays.sort(A);
        int min = 0;
        int sum = 0;
        while (K != 0){
    
    
            if (A[min] > 0){
    
    
                if (K % 2 == 1){
    
    
                    A[min] = -A[min];
                    K = 0;
                }else {
    
    
                    K = 0;
                }
            }else if (A[min] < 0){
    
    
                A[min] = -A[min];
                K--;
                //这里不需要排序,第一个数后面的已经是顺序的
                if (min <= A.length-1 && A[min] > A[min + 1]){
    
    
                    min++;
                }
            }else {
    
    
            //最小值等于0,0取反还是0
                K = 0;
            }
        }
        for (int i : A) {
    
    
            sum += i;
        }
        return sum;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45376713/article/details/108867131