python每日一题 贪心算法 - 实践
给你一个整数数组 nums
和一个整数 k
,按以下方法修改该数组:
- 选择某个下标
i
并将nums[i]
替换为-nums[i]
。
重复这个过程恰好 k
次。可以多次选择同一个下标 i
。
以这种方式修改数组后,返回数组可能的最大和 。
意思就是我可以将该数组中的k个元素进行加负号的变换 开始我先找数组中是负数的 找到我就给加上一个负号 将这个下标统计下来 然后如果负数的已经没了 看剩下的是 奇数还是偶数 如果是偶数 那么就直接将数组的所有值加起来就行(这样一看 貌似也不要求统计下标 因为是多变的)如果是奇数 看有没有0 如果有0的话 那么也许可直接返回数组和 若是没0 那么就找一个最小的正数 将其变为负数 统计数组和
OK 那么思路就是 先将数组中的所有元素变为正数 并且记录一个正数的最小值 先记下来 假设有元素 0 那么也记录下来 之后就不用再遍历一次了
奇数 倘若有0 那么直接统计 如果没有 将那种正数最小值加上一个负号 随后进行统计 (其实也许可在变为正数的时候直接统计和)就是之后看剩下的K是奇数还是偶数 如果是偶数 那不用管 如果
然后我就发现了问题 如果k的数目还没有数组中的负数多咋办 这样其实应该先将负数最小的先变为正的再说
先试试就是那不如直接对数组进行排序 排序之后从负数那边开始 将负数变为正数 然后如果全部变成正数 要是没0的话 只能对正数最小的进行消耗 那么再进行一次排序 即可 我有点担心这个会超出运行时间 只是还
class Solution(object):
def largestSumAfterKNegations(self, nums, k):
nums=sorted(nums)#首先进行排序
Cl_0=False
for i in range(len(nums)):
if nums[i]=1:
nums[i]=-nums[i]
k-=1
else:
return sum(nums)
elif nums[i]==0:
Cl_0 = True
break
else:
break
if Cl_0==True:
return sum(nums)
#如果没0,但是剩余的k是偶数个
if k%2==0:
return sum(nums)
else:
nums = sorted(nums)
nums[0]=-nums[0]
return sum(nums)
solution=Solution()
result=solution.largestSumAfterKNegations([4,-2,-3],1)
print(result)
先把负数变成正的 如果k不够 那直接return sum 就行 如果K够了 有0的话最好 如果没有0 那么就找一个正数最小的就是没超出运行时间 运行速度100% 思路就
还好我今天的收尾是选择一个我擅长的并且简单的 不然又要破防了 大家晚安~