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

相关推荐
傻啦嘿哟6 小时前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
迷迭香yy6 小时前
集合竞价数据挖掘实战:用Python构建开盘信号识别系统
人工智能·python·数据挖掘
小程故事多_807 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
2601_956121978 小时前
二分算法(知识点+题目)
c++·算法
李昊哲小课9 小时前
fastapi sse websocket 奶茶店实时订单看板
人工智能·python·websocket·网络协议·fastapi·sse
2401_8445829511 小时前
工具包:软件架构设计的实用技巧与经验分享
python
RFID固定资产管理系统11 小时前
适配媒体行业的固定资产管理软件有哪些功能与核心优势
大数据·人工智能·python·媒体
AndrewHZ11 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
SunnyDays101111 小时前
Python 为 PowerPoint 添加动画:进入、退出、动作路径与文本动画(详解)
python·powerpoint·动画·动画效果·文本动画
小星星闪亮登场12 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先