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

文章介绍了三种编程问题的解决方案:最大数组和通过先处理负数,加油站问题通过找到连续可行路径,分发糖果通过两次遍历调整糖果分配。每个问题都涉及局部最优策略的运用。
摘要由CSDN通过智能技术生成

1005、K次取反后最大数组和:

class Solution(object):
    def largestSumAfterKNegations(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        nums = sorted(nums, key=lambda x: abs(x), reverse=True)
        for i in range(len(nums)):
            if k == 0:
                return sum(nums)
            if nums[i] < 0:
                nums[i] = -nums[i]
                k -= 1
        while k > 0:
            nums[-1] = -nums[-1]
            k -= 1
        return sum(nums)

 局部最优:先对绝对值最大的负数操作,如果全部负数操作完后k还不为0,对绝对值最小的非负数进行剩余次数的操作

本题分两次局部最优,先操作负数,负数操作完还没结束,再操作绝对值最小的非负数,思路巧妙

134、加油站:

class Solution(object):
    def canCompleteCircuit(self, gas, cost):
        """
        :type gas: List[int]
        :type cost: List[int]
        :rtype: int
        """
        cur_sum, total_sum, start = 0, 0, 0
        for i in range(len(gas)):
            cur_sum += gas[i] - cost[i]
            total_sum += gas[i] - cost[i]
            if cur_sum < 0:
                start = i + 1
                cur_sum = 0
        if total_sum < 0:
            return -1
        return start

局部最优:若当前区间的累计和curSum小于0,则当前区间不存在满足题意的起点,更新start为i+1, curSum更新为0,重新开始寻找起点

135、分发糖果:

class Solution(object):
    def candy(self, ratings):
        """
        :type ratings: List[int]
        :rtype: int
        """
        res = [1] * len(ratings)
        for i in range(1, len(ratings)):
            if ratings[i] > ratings[i-1]:
                res[i] = res[i-1] + 1
        for i in range(len(ratings)-1, 0, -1):
            if ratings[i-1] > ratings[i]:
                res[i-1] = max(res[i] + 1, res[i-1])
        return sum(res)

本题分两次比较,一次是从左向右遍历,一次是从右向左遍历,遇到后面比前面的评分高,则改糖果数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值