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

题目:

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

题解:

贪心策略:

  1. 先取反所有负数(负数取反后变成正数,能使数组最终和变大)
  2. 如果取反所有负数之后,还有取反次数,因为取反可能会导致数组和变小(正数变成负数),所以应该取反当前数组中最小的元素,这样减少的最小,数组和才能最大

步骤:

  1. 从小到大排序
  2. 对负数进行取反
  3. 如果还有剩余取反次数,对最小的正数取反

注意:对同一个数取反偶数次,相当于没有取反,值不变。

    public int largestSumAfterKNegations(int[] nums, int k) {
        Arrays.sort(nums);
        int sum = 0;
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] < 0 && k > 0) {
                nums[i] = -nums[i];
                k--;
            }

            min = Math.min(min, nums[i]);
            sum += nums[i];
        }

        if ((k & 1) == 1) {
            sum -= 2 * min;
        }

        return sum;
    }

时间复杂度:O(n\log n)

你可能感兴趣的:(LeetCode,leetcode,贪心算法)