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

107 阅读1分钟

题目:
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

  • 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。

重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。

算法: 方法一:模拟

func largestSumAfterKNegations(nums []int, k int) int {
    sort.Ints(nums)
    sum := 0
    minVal := math.MaxInt32
    for i := 0; i < len(nums) ; i ++ {
        // 先将负数改为正数
        if nums[i] < 0 && k > 0 {
            nums[i] = -nums[i]
            k --
        }
        // 如果有数字为0,则消耗所有的k
        if nums[i] == 0 {
            k = 0
        }
        // 找到翻转后的最小值
        if nums[i] < minVal {
            minVal = nums[i]
        }
        sum = sum + nums[i]
    }
    // 还有剩余的k需要翻转,并且翻转次数为奇数次,找最小的数翻转
    if k % 2 != 0 {
        sum = sum - 2 * minVal
    }
    return sum
}