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

相关推荐
点云-激光雷达-Slam-三维牙齿1 小时前
速度起飞 笔记本电脑6G显卡llama运行Qwen3.6 35BA3B MTP 大模型
人工智能·python·电脑·llama
言乐62 小时前
Python游戏水平测试辅助系统
开发语言·python·游戏·django·pygame
从零开始学习人工智能8 小时前
【踩坑实录】WSL2 解决 onnxruntime\-gpu ImportError: libcudart\.so\.13 无 CUDA13 运行库问题
python
大明者省8 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
卷无止境9 小时前
在 awesome-fastapi 里,哪些库值得一看?
后端·python
zhanghaha131410 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
Python私教10 小时前
API 输出模型怎么设计:从 model_dump() 到显式展示层
python·fastapi
白狐_79810 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
Python私教10 小时前
本地 AI 工具服务该绑定 127.0.0.1 还是 0.0.0.0?
python·fastapi
zander25810 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法