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

思路:解决这个题就是将最小的数进行k次取反,具体步骤看代码

public static int largestSumAfterKNegations(int[] arr,int k) {
        int sum = 0;
        int count = 0;
        //1.进行排序
        Arrays.sort(arr);
        //2.如果第一个元素大于0,那么就将第一个元素取k次反
        if(arr[0]>0) {
            while(k>0) {
                arr[0] = -arr[0];
                k--;
            }
        }else {
            
            for(int i = 0;i<arr.length;i++) {
                //3.第一个数小于0,直接取反count加1
                if(arr[i] < 0 && count < k) {
                    arr[i] = -arr[i];
                    count++;
                }else if(arr[i] == 0 &&count<k){
                    //4.第i个数为0,并且count小于k,那么我们对0进行取反操作,即直接break
                    break;
                }else if(arr[i] > 0 && count <k){
                    //5.如果第i个数大于0,并且count小于k,那么我们将第i个数和第i-1的数做比较
                    //将小的数进行k-count次取反
                    if(arr[i] > arr[i-1])
                        arr[i - 1] = arr[i-1]*(int)Math.pow(-1,k - count);
                    else arr[i] = arr[i]*(int)Math.pow(-1,k - count);
                    break;
                }
            }
        }
        //6.求和
        for(int i : arr)
            sum += i;
        return sum;
    }

猜你喜欢

转载自www.cnblogs.com/duy666/p/10506449.html