代码随想录 - Day38 - 贪心算法

代码随想录 - 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…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值