代码随想录27期|Python|Day33|贪心算法|1005.K次取反后最大化的数组和|134. 加油站|135. 分发糖果

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

思路比较简单,把所有的负数绝对值大的全部取反之后再在新的数组里把绝对值最小的重复取反即可。

python 复制代码
class Solution(object):
    def largestSumAfterKNegations(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        # 按照绝对值的大小从大到小排序(方便后面直接取出绝对值最小的值)
        nums.sort(key = lambda x: abs(x), reverse = True)
        for i in range(len(nums)):
            if nums[i] < 0 and k > 0:
                nums[i] = -nums[i]
                k -= 1
        if k % 2:
            nums[-1] = -nums[-1]
        return sum(nums)

134. 加油站

本题适合从差值入手,也就是引入一个gas-cost的变量来标记经过每一个车站的剩余油量。

分别记录当前的总剩余量和每次走过后的剩余量:

1、总剩余量小于0,说明无论如何都无法走完全程;

2、当前剩余量小于0,说明之前一个起始点位置不对,需要从i+1开始当作起始点;

3、由于答案是唯一的,所以最后满足条件的起始位置就是返回的结果。

由于1、2步可以在同一个遍历全部数组的循环中实现,所以只要一个for从开头遍历到结尾即可。

python 复制代码
class Solution(object):
    def canCompleteCircuit(self, gas, cost):
        """
        :type gas: List[int]
        :type cost: List[int]
        :rtype: int
        """
        start = 0
        cur_sum = 0
        ttl_sum = 0
        for i in range(len(gas)):
            ttl_sum += gas[i] - cost[i]
            cur_sum += gas[i] - cost[i]

            if cur_sum < 0:
                start = i + 1
                cur_sum = 0
        if ttl_sum < 0:
            return -1
        return start

135.分发糖果

本题的思路是分两次谈心,两次遍历的局部最优就是全局最优。

首先,初始化全部的糖果数量,保证每个人至少都能分到一个糖果。

第一遍,从左往右,如果右边的比左边评分高,那么右边的比左边多一个糖果;

第二遍,从右往左,如果左边的评分比右边的高,那么此时需要比较"左边经过第一遍之后的糖果"和"右边糖果数量+1"谁更大,取较大值即可。

python 复制代码
class Solution(object):
    def candy(self, ratings):
        """
        :type ratings: List[int]
        :rtype: 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])  # 注意,如果是本来分发的糖果数量比右边的+1还要大,那就不需要再给新的糖果了(保证最少)
        return sum(candy_list)

OMG断卡两周再次继续!!第33天完结!!

相关推荐
modelmd14 分钟前
camel-ai Agent模块- DeductiveReasonerAgent
人工智能·python·camel-ai
先做个垃圾出来………18 分钟前
简单的 Flask 后端应用
后端·python·flask
码破苍穹ovo29 分钟前
二分查找----1.搜索插入位置
数据结构·算法
晨曦54321030 分钟前
tkinter Entry(输入框)组件学习指南
python
丘山子1 小时前
判断 Python 代码是否由 LLM 生成的几个小技巧
后端·python·面试
豌豆花下猫1 小时前
Python 潮流周刊#107:无 GIL Python 被正式批准(摘要)
后端·python·ai
椒哥1 小时前
爬虫框架playwright使用小技巧
后端·爬虫·python
Takina~1 小时前
python打卡day54
python·深度学习·机器学习
广州山泉婚姻1 小时前
Python函数编写指南
人工智能·python·深度学习
烨然若神人~1 小时前
算法第38天|322.零钱兑换\139. 单词拆分
算法