代码随想录算法训练营day33 | 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

1005.K次取反后最大化的数组和

两次贪心

  1. 将负数反转,按照绝对值从大到小的顺序
  2. 如果还有剩余反转次数,则将绝对值最小的值反复反转

做题步骤

  1. 按照绝对值从大到小排序
  2. 从大到小遍历数组,遇到负数则反转,k-1
  3. 如果还有剩余反转次数,则将绝对值最小的值反复反转
  4. 求和
class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        nums.sort(key=lambda x: abs(x), reverse=True)
        for i in range(len(nums)):
            if k <= 0:
                break
            if nums[i] < 0:
                nums[i] *= -1
                k -= 1
        if k % 2 == 1:
            nums[-1] *= -1
        return sum(nums)

134. 加油站

从i开始累加剩余油量curSum,一但curSum<0,则调到当前位置的下一个,因为从i开始到当前都不可能作为起始站了。

还有一个要从全局进行考虑,总油量必须要大于等于总消耗,因为这样才能在判断起始站后,后续的油量是大于等于消耗的,才能满足条件

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        curSum = 0
        totalSum = 0
        start = 0
        for i in range(len(gas)):
            curSum += gas[i] - cost[i]
            totalSum += gas[i] - cost[i]
            if curSum < 0:
                start = i + 1
                curSum = 0
        if totalSum < 0:
            return -1
        return start

135. 分发糖果

  1. 先从左往右遍历,确定右边孩子比左边孩子评分高的可以满足
  2. 再从右往左遍历,确定左边孩子比右边孩子评分高的可以满足
class Solution:
    def candy(self, ratings: List[int]) -> int:
        candy_list = [1] * len(ratings)
        for i in range(1, len(ratings)):
            if ratings[i] > ratings[i-1]:
                candy_list[i] = candy_list[i-1] + 1
        for i in range(len(ratings)-2, -1, -1):
            if ratings[i] > ratings[i+1]:
                candy_list[i] = max(candy_list[i+1]+1, candy_list[i])
        return sum(candy_list)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值