Blog.

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

Cover Image for K 次取反后最大化的数组和
Bernie
Bernie

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

leetcode 链接

思路:

1.先从小到大排序,是的负数在前面。

2.遍历数组,当 nums[i]为负数,且 k 大于 0 时, 则将 nums[i]取反,k 减 1,然后相加得到总和 sum, 同时判断当前 nums[i]的值是否小于 min,若小于则将其值赋值给 min。

3.判断剩余的 k 是否大于 0, 若大于 0 且 k % 2 == 1, 则需要用总和 sum 减去两倍的最小值 min,最后返回总和 sum 即可。

typescript 解法

function largestSumAfterKNegations(nums: number[], k: number): number {
  // 从小到大排序
  nums.sort((a: number, b: number): number => a - b);
  let min: number = 101;
  let sum: number = 0;
  for (let i = 0; i < nums.length; i++) {
    let current = nums[i];
    if (current < 0 && k != 0) {
      current = -current;
      k--;
    }
    if (current < min) {
      min = current;
    }
    sum += current;
  }
  if (k > 0 && k % 2 === 1) {
    sum -= 2 * min;
  }
  return sum;
}

go 解法

func largestSumAfterKNegations(nums []int, k int) int {
    sum := 0
    min := 101
    sort.Ints(nums)

    for i := 0; i< len(nums); i ++ {
        current := nums[i]
        if current < 0 && k != 0 {
            current = -current
            k --
        }
        if current < min {
            min = current
        }
        sum += current;

    }

    if k > 0 && k % 2 == 1 {
        sum -= 2 * min
    }

    return sum
}