LeetCode 1005. K 次取反后最大化的数组和

1005. K 次取反后最大化的数组和

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

  • 选择某个下标 i 并将 nums[i] 替换为 -nums[i]

重复这个过程恰好 k 次。可以多次选择同一个下标 i

以这种方式修改数组后,返回数组 可能的最大和

示例 1:

输入:nums = [4,2,3], k = 1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。

示例 2:

输入:nums = [3,-1,0,2], k = 3
输出:6
解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。

示例 3:

输入:nums = [2,-3,-1,5,-4], k = 2
输出:13
解释:选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4] 。

提示:

  • 1 <= nums.length <= 104
  • -100 <= nums[i] <= 100
  • 1 <= k <= 104

排序后遍历

先将数组排序,如果k大于等于数组负数的个数需要特殊处理

遍历数组,先将数组中的负数翻转,消耗k ,k--,

原数组中有正数处理方法如下

  1. k消耗光了,但是数组还是有负数,那么直接求和即可
  2. k没消耗光,数组负数都没有了
    1. 当前位置i的值是0, 求和即可,k归零
    2. 当前位置i的值大于0,k如果是偶数,则直接求和即可,如果为奇数说明必须加上一个负数,那么需要找出这个数组中最小的数,因为排序过所以比较好找需要找当前i和i-1位置的数字比较, k归零

原数组中无正数

最后需要看下k是否归零了,如果不为0,说明,原数组中的所有值都翻转过了,需要再次看k是奇数or偶数

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        Arrays.sort(nums);
        int len = nums.length;
        int ans = 0;
        for (int i = 0; i < len;i++) {    
            if (nums[i] < 0 &&k > 0){
                // 翻转
                nums[i] = -nums[i];
                ans += nums[i];
                k--;
            } else if (nums[i] > 0 && k > 0) {
                if (k%2==0) {
                    // 此时数组之前的数已经没有负数了,k翻转偶数次
                    k=0;
                    ans += nums[i];
                } else {
                    // 此时只能取得负数或者0了,不能让全部数组变为正数
                    if(i>1 && nums[i-1]< nums[i]){
                        // nums[i-1]已经加过了,需要减去
                        ans -= nums[i-1] * 2;
                        ans += nums[i];
                    } else {
                        ans -= nums[i];
                    }
                }
                k = 0;
            } else {
                //剩余情况 k = 0; 此时不再翻转
                // nums[i] 等于0 此时数组中全部为正数最大 将k 置位0
                ans += nums[i];
                k=0;
            }

        }
        // 还需再次判断k 输入 [-4,-2,-3] 4 此时k没有消耗完成 循环结束
        if (k > 0) {
            if(k % 2 != 0) {
                 ans -= nums[len -1] * 2; 
            }
        }
        return ans;
    }
}
posted @ 2021-12-03 11:21  _Salvatore  阅读(28)  评论(0)    收藏  举报