1005. K 次取反后最大化的数组和 - 力扣(LeetCode)
可以使用贪心算法来解决这个问题:
-
优先反转最小的负数:首先对数组进行排序,使得负数排在前面。然后,将最小的负数逐步变为正数,直到
k
用完或没有负数可反转。 -
如果还有剩余的
k
:如果k
仍然大于零,并且k
是奇数,则需要反转最小的数(无论是正数还是负数)。 -
计算最终的数组和:最终计算数组元素之和即可。
以下是实现代码(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(nlogn),遍历数组的时间复杂度为 O(n),因此整体时间复杂度为 O(nlogn)。
-
空间复杂度:只使用了常数额外空间,故为 O(1)。
这样可以保证在 k
次操作后得到数组的最大可能和。