Day 34 代码随想录 贪心第三天


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

   题目链接:1005. K 次取反后最大化的数组和
在这里插入图片描述

 
  这题自己写出来了,感觉没用到贪心。

class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        for i in range(k):
            a= min(nums)
            a_index=nums.index(a)
            nums[a_index]=-nums[a_index]
        return sum(nums)

134. 加油站

   题目链接:134. 加油站
在这里插入图片描述

 

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

135. 分发糖果

   题目链接:135. 分发糖果
在这里插入图片描述

 
  没想到这题是个困难题目,而且反向遍历也很难想到。反向遍历的效果与从右往左是一样的。很巧妙。

class Solution:
    def candy(self, rating: List[int]) -> int:
        res=[1]*len(rating)
        left=0
        right=1
        while right<len(rating):
            if right<len(rating) and rating[left]<rating[right] and res[left]>= res[right]:
                res[right]=res[left]+1
                right+=1
                left+=1
            elif right<len(rating) and rating[left]>rating[right] and res[left]<=res[right]:
                res[left] = res[right]+1
                right += 1
                left += 1
            else:
                right += 1
                left += 1
        for i in range(len(rating)-1,0,-1):
            if rating[i - 1] > rating[i]:
                # 如果相邻前一个数更大,那前一个孩子就要比后一个孩子多一个糖果,取左右遍历得到的最大数即满足左右循环且最小糖果数
                res[i - 1] = max(res[i - 1], res[i] + 1)
        return sum(res)

简洁版

class Solution:
    def candy(self, ratings: List[int]) -> int:
        # 先初始给每一个孩子一个糖果
        ls = [1]*len(ratings)
        # 从左往右遍历比较大小
        for i in range(len(ratings)-1):
            # 如果相邻后一个数更大,那后一个孩子就要比前一个孩子多一个糖果
            if ratings[i+1] > ratings[i]:
                ls[i+1]=ls[i]+1
        # 从右往左遍历比较大小
        for i in range(len(ratings)-1, 0, -1):
            if ratings[i-1] > ratings[i]:
                # 如果相邻前一个数更大,那前一个孩子就要比后一个孩子多一个糖果,取左右遍历得到的最大数即满足左右循环且最小糖果数
                ls[i-1]=max(ls[i-1], ls[i]+1)
        return sum(ls)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值