zl程序教程

您现在的位置是:首页 >  其他

当前栏目

每日一题---1005. K 次取反后最大化的数组和[力扣][Go]

2023-03-14 22:59:45 时间

题目描述

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

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

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

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

解题代码

// 我的贪心
func largestSumAfterKNegations(nums []int, k int) int {
    res := 0
    for i := 0; i < k; i++ {
        sort.Ints(nums)
        nums[0] = -nums[0]
    }
    for _, num := range nums {
        res += num
    }
    return res
}
// 大佬的贪心
func largestSumAfterKNegations(nums []int, K int) int {
    // 自定义排序将数组中按绝对值从大到小排序
    sort.Slice(nums, func(i, j int) bool {
        return math.Abs(float64(nums[i])) > math.Abs(float64(nums[j]))
    })
    // 将负数变为正数
    for i := 0; i < len(nums); i++ {
        if K > 0 && nums[i] < 0 {
            nums[i] = -nums[i]
            K--
        }
    }
    // 如果k有剩余将最后一位翻转
    if K%2 == 1 {
        nums[len(nums)-1] = -nums[len(nums)-1]
    }
    // 统计结果
    result := 0
    for i := 0; i < len(nums); i++ {
        result += nums[i]
    }
    return result
}

运行结果

我的结果

image

大佬的结果

image

我还是不够贪心啊image