DAY34 贪心算法part03

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

思路:每次都找出最小的一个值 然后将其nums[i] -> -nums[i]。因为当这个数字为负数时,将其变为正数显然能够使得整个数组和增加最多,当这个数字为最小正数时,这样的变化也可以使得代价最小

class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        # 每次都找出最小的一个值 然后将其nums[i] -> -nums[i]
        # 因为当这个数字为负数时,将其变为正数显然能够使得整个数组和增加最多
        # 当这个数字为最小正数时,这样的变化也可以使得代价最小
        for i in range(k):
            nums.sort()
            nums[0] = -nums[0]
        res = 0
        for num in nums:
            res+=num
        return res

时间复杂度应该是O (knlogn)

134.加油站

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        n = len(gas)
        cur_sum = 0
        min_sum = float('inf')
        for i in range(n):
            cur_sum += gas[i] - cost[i]
            min_sum = min(min_sum,cur_sum)
        # 若gas的总和小于cost的总和,则无论从哪里出发都是跑不了一圈的
        if cur_sum < 0:return -1
        # rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站。
        # 如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。
        if min_sum >= 0:return 0
        # 如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。
        for j in range(n-1,0,-1):
            min_sum+=gas[j] - cost[j]
            if min_sum >= 0:
                return j
        return -1

135.分发糖果

错误代码
在这里插入图片描述

# 错误代码1
class Solution:
    def candy(self, ratings: List[int]) -> int:
        # 首先每个孩子都需要给分发一个糖果
        ans = 0
        n = len(ratings)
        for i in range(1,n):
            if ratings[i] != ratings[i-1]:
                ans += 1
        return ans + n
# 错误代码2
class Solution:
    def candy(self, ratings: List[int]) -> int:
        # 首先每个孩子都需要给分发一个糖果
        ans = 0
        n = len(ratings)
        candynum = [1] * n
        for i in range(1, n):
            if ratings[i] > ratings[i-1] and candynum[i] <= candynum[i-1]:
                candynum[i]+=1
            elif ratings[i] < ratings[i-1] and candynum[i] >= candynum[i-1]:
                candynum[i-1]+=1
        return sum(candynum)
class Solution:
    def candy(self, ratings: List[int]) -> int:
        # 首先每个孩子都需要给分发一个糖果
        n = len(ratings)
        candynum = [1] * n
        # 从左往右 遍历比较大小
        for i in range(n-1):
            # 若相邻后一个数字更大 那后一个孩子就要比前一个孩子多一个糖果
            if ratings[i+1] > ratings[i]:
                candynum[i+1] = candynum[i]+1
        # 从右往左 遍历比较大小
        for i in range(n-1,0,-1):
            if ratings[i-1] >ratings[i]:
                # 若相邻前一个数字更大 那么前一个孩子就要比后一个孩子多一个糖果
                # 取左右遍历得到的最大数 即满足左右循环且最小糖果数
                candynum[i-1] = max(candynum[i-1],candynum[i]+1)
        return sum(candynum)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值