代码随想录算法训练营第二十八天| 第八章 贪心part03

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

class Solution:
    def largestSumAfterKNegations(self, nums: List[int], K: int) -> int:
        nums.sort(key=lambda x: abs(x), reverse=True)  # 第一步:按照绝对值降序排序数组A
        for i in range(len(nums)):  # 第二步:执行K次取反操作
            if nums[i] < 0 and K > 0:
                nums[i] *= -1
                K -= 1
        if K % 2 == 1:  # 第三步:如果K还有剩余次数,将绝对值最小的元素取反
            nums[-1] *= -1
        result = sum(nums)  # 第四步:计算数组A的元素和
        return result

        

134. 加油站

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

135. 分发糖果

class Solution:
    def candy(self, ratings: List[int]) -> int: 
        if len(ratings) < 2:
            return 1
        candyL = [1] * len(ratings)
        candyL[0] = 1
        for i in range(1,len(ratings)):
            if ratings[i] > ratings[i-1]:
                candyL[i] = candyL[i-1]+1
        for i in range(len(ratings)-2,-1,-1):
            if ratings[i] > ratings[i+1]:
                candyL[i] =  max(candyL[i], candyL[i + 1] + 1)
        return sum(candyL)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值