题目描述
- 给定一个整数数组 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
}