Sort ascending, negate negative values first, then use any odd leftover operation on the smallest absolute value.
Complexity
O(n log n) time and language-dependent sorting space.
Maximize an array sum after negating exactly k elements, with repeated choices allowed.
Sort ascending, negate negative values first, then use any odd leftover operation on the smallest absolute value.
O(n log n) time and language-dependent sorting space.
package main
import "sort"
func largestSumAfterKNegations(nums []int, k int) int {
sort.Ints(nums)
for index := 0; index < len(nums) && k > 0 && nums[index] < 0; index++ {
nums[index] = -nums[index]
k--
}
sum, minimum := 0, nums[0]
for _, value := range nums {
sum += value
if value < minimum {
minimum = value
}
}
if k%2 == 1 {
sum -= 2 * minimum
}
return sum
}
class Solution:
def largestSumAfterKNegations(self, nums: list[int], k: int) -> int:
nums.sort()
for index in range(len(nums)):
if k == 0 or nums[index] >= 0: break
nums[index] = -nums[index]; k -= 1
return sum(nums) - (2 * min(nums) if k % 2 else 0)
function largestSumAfterKNegations(nums: number[], k: number): number {
nums.sort((left, right) => left - right);
for (let index = 0; index < nums.length && k > 0 && nums[index] < 0; index += 1, k -= 1) nums[index] = -nums[index];
let sum = nums.reduce((total, value) => total + value, 0);
if (k % 2 === 1) sum -= 2 * Math.min(...nums);
return sum;
}