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

1005. K 次取反后最大化的数组和 - 力扣(LeetCode)

可以使用贪心算法来解决这个问题:

  1. 优先反转最小的负数:首先对数组进行排序,使得负数排在前面。然后,将最小的负数逐步变为正数,直到 k 用完或没有负数可反转。

  2. 如果还有剩余的 k:如果 k 仍然大于零,并且 k 是奇数,则需要反转最小的数(无论是正数还是负数)。

  3. 计算最终的数组和:最终计算数组元素之和即可。

以下是实现代码(Python):

def largestSumAfterKNegations(nums, k):
    nums.sort()  # 先排序,使负数在前
    for i in range(len(nums)):
        if k > 0 and nums[i] < 0:
            nums[i] = -nums[i]
            k -= 1
    
    # 如果 k 仍然大于 0,并且是奇数,则反转最小的数
    if k % 2 == 1:
        nums.sort()  # 重新排序,找到最小的数
        nums[0] = -nums[0]
    
    return sum(nums)

# 示例
print(largestSumAfterKNegations([4,2,3], 1))  # 输出 5
print(largestSumAfterKNegations([3,-1,0,2], 3))  # 输出 6
print(largestSumAfterKNegations([2,-3,-1,5,-4], 2))  # 输出 13

算法分析

  • 时间复杂度:排序操作的时间复杂度为 O(nlog⁡n),遍历数组的时间复杂度为 O(n),因此整体时间复杂度为 O(nlog⁡n)。

  • 空间复杂度:只使用了常数额外空间,故为 O(1)。

这样可以保证在 k 次操作后得到数组的最大可能和。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值