代码随想录 - Day38 - 贪心算法
找了个测试实习,通勤时间加起来快四小时,实在没空写题
之前上班摸鱼做了道跳跃游戏Ⅱ,在就没有进度了
1005. K 次取反后最大化的数组和
思路还蛮好想,但是感觉我这种做法有点复杂,每变换一次都要sort()
一下,复杂度应该会很高
nums.sort()
if nums[0] >= 0:
if k % 2 == 0:
return sum(nums)
else:
nums[0] = -nums[0]
return sum(nums)
while k > 0:
nums[0] = -nums[0]
nums.sort()
print(nums, k)
k -= 1
return sum(nums)
原来还可以用sorted(nums, key=abs)
实现按照绝对值大小排序
绝对值排序后,从后往前,遇到负数就变成正数,注意 k
的次数
整体负变正后,如果 k
还没用完,就看一下 k
的奇偶,根据 k
的奇偶决定最小的 nums[0]
用不用再变一次
这个方法比我一开始想的简洁许多,不用再频繁sort()
了,复杂度明显降低
nums = sorted(nums, key=abs)
for i in range(len(nums) - 1, -1, -1):
if k == 0:
break
if nums[i] < 0:
nums[i] = -nums[i]
k -= 1
if k == 0 or k % 2 == 0:
return sum(nums)
nums[0] = -nums[0]
return sum(nums)
134. 加油站
先写了一下暴力法,通过 35/40 ,python用暴力法就比较慢了,会超时,得换别的方法
# 暴力
for i in range(len(cost)):
rest = gas[i] - cost[i]
index = (i + 1) % len(cost)
while rest > 0 and index != i:
rest += gas[index] - cost[index]
index = (index + 1) % len(cost)
if rest >= 0 and index == i:
return i
return -1
tbc…