难度简单289收藏分享切换为英文接收动态反馈
给你一个整数数组 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
解题思路: 分类讨论 1、先对数组进行排序 2、如果有负数,那么从最小的负数开始替换, 直到所有负数变为正数,或k次耗尽 2.1 若k次耗尽,则返回数组元素和 2.2 若k次没有耗尽, 2.2.1 若k为偶数,意味着可选择同一个元素变换2次, 则直接返回数组元素和 2.2.2 若k为奇数,则选择最小的正数进行替换一次, 然后返回数组元素和 3、如果没有负数 3.1 若k为偶数,则直接返回数组元素和 3.2 若k为奇数,则选择最小的正数进行替换一次, 然后返回数组元素和
AC代码:
class Solution(object):
def largestSumAfterKNegations(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
"""
解题思路:
1、先对数组进行排序
2、如果有负数,那么从最小的负数开始替换,
直到所有负数变为正数,或k次耗尽
2.1 若k次耗尽,则返回数组元素和
2.2 若k次没有耗尽,
2.2.1 若k为偶数,意味着可选择同一个元素变换2次,
则直接返回数组元素和
2.2.2 若k为奇数,则选择最小的正数进行替换一次,
然后返回数组元素和
3、如果没有负数
3.1 若k为偶数,则直接返回数组元素和
3.2 若k为奇数,则选择最小的正数进行替换一次,
然后返回数组元素和
"""
sum=0
nums.sort()
if nums[0]>=0: # 数组没有 负数 的情况
if k%2==0:
for x in nums:
sum+=x
return sum
else:
nums[0]=-nums[0]
for x in nums:
sum+=x
return sum
else:
cnt=0
while k>0:
if cnt<=len(nums)-1 and nums[cnt]<0 :
nums[cnt]=-nums[cnt]
cnt+=1
k-=1
else:
break
if k % 2 == 0:
for x in nums:
sum += x
return sum
else:
nums.sort()
nums[0] = -nums[0]
for x in nums:
sum += x
return sum