要求
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后,返回数组 可能的最大和 。
示例 1:
输入:nums = [4,2,3], k = 1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。
示例 2:
输入:nums = [3,-1,0,2], k = 3
输出:6
解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。
示例 3:
输入:nums = [2,-3,-1,5,-4], k = 2
输出:13
解释:选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4] 。
提示:
- 1 <= nums.length <= 104
- -100 <= nums[i] <= 100
- 1 <= k <= 104
核心代码
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
a = sorted(nums)
i,n = 0,len(a)
while i < n and i < k and a[i] < 0:
a[i] = -a[i]
i += 1
return sum(a) - (k -i) % 2 * 2 * min(a)
解题思路:1.从小到大排序 2.先用取反的机会把负数变正,直到k次机会用光或者所有数都为正 3.若k次机会用光,直接求和;若没用光,说明数组a此时都是正数,若剩余的取反次数不能被2整除,必定有个数会变为负数,让数组最小值变为负求和可得到最小值,若能被2整除,直接求和。最后的部分比较(k -i) % 2 * 2 * min(a)
,取余的部分上面有解释,我们看乘2是因为加和中算了当前的数字,所以我们需要减一次,去掉这个数字,在减一次,是最小值取负的结果,所以减了两次。