代码随想录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天完结!!

相关推荐
开源量化GO2 分钟前
学量化:看到“2026年 AI 写 Python”内容时,先用示例和练习补交易认知
人工智能·python
旖旎夜光7 分钟前
LeetCode 974:和可被 K 整除的子数组(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和
无限码力11 分钟前
拼多多笔试真题 2026-8-30【唯一入栈出库序列】
算法·pdd笔试真题·拼多多春招笔试真题·拼多多秋招笔试真题·拼多多笔试真题题解·拼多多最新笔试题库
lvwangshu11 分钟前
分治:序列分治(CDQ)与点分治
算法·分治
无限码力16 分钟前
2026-8-30拼多多笔试真题-哪个查阅窗能留空(C++/Py/Java /Js/Go)
算法·pdd·pdd笔试真题·拼多多春招笔试真题·拼多多秋招笔试真题·拼多多笔试真题题解·拼多多笔试题解
SelectDB技术团队20 分钟前
StarRocks 适合做日志分析吗?
大数据·数据结构·后端·python·doris·日志分析·starrock
luj_176836 分钟前
毒素驱动的生物自毁机制探析
服务器·c语言·开发语言·经验分享·算法
weixin_3077791339 分钟前
Databricks里用PySpark统计指定表和字段中各字段的空值、空字符串或零值比例
运维·数据仓库·python·spark·云计算
海兰44 分钟前
【 Python 量化交易】第6章:数据可视化
开发语言·python·信息可视化
多多鼠1 小时前
Tool Calling的信任边界:从协议校验到执行沙箱的完整链路设计
运维·开发语言·网络·人工智能·python·langchain