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

题目描述

  • 给定一个整数数组 nums 和一个整数 k
  • 需要操作 k 次,每次都是将数组中的某个数变成相反数,可以多次操作同一个数
  • 求 k 次操作后的数组和

示例

输入:nums = [4,2,3], k = 1
输出:5
输入:nums = [3,-1,0,2], k = 3
输出:6
输入:nums = [2,-3,-1,5,-4], k = 2
输出:13

题解

  • 思路
    • 把 <0 的数从小到大取相反数
    • 如果负数不够,看剩余的 k 是奇数还是偶数
      • 偶数,负负得正
      • 奇数,把当下最小的数取反(因为负数已经没了,此时最小的数就是数组中绝对值最小的数)
func largestSumAfterKNegations(nums []int, k int) int {
    cnt := map[int]int{}
    low := 200
    for _, x := range nums {
        cnt[x] ++
        if x < 0 { x *= -1 }
        low = min(low, x) // 维护 min(|x|)
    }

    for i := -100; i < 0 && k > 0; i ++ {
        for cnt[i] > 0 && k > 0 {
            cnt[i] --
            cnt[-i] ++
            k --
        }
    }

    res := 0
    for i := -100; i <= 100; i ++ { res += i * cnt[i] }
    if k & 1 == 1 { res -= 2 * low }
    return res
}
posted @ 2025-08-23 22:53  余越  阅读(7)  评论(0)    收藏  举报