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

相关推荐
汉克老师2 小时前
第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(5、机甲战士)
c++·算法·蓝桥杯·01背包·蓝桥杯c++·c++蓝桥杯
乔巴先生243 小时前
LLMCompiler:基于LangGraph的并行化Agent架构高效实现
人工智能·python·langchain·人机交互
Mr_Xuhhh3 小时前
项目需求分析(2)
c++·算法·leetcode·log4j
c++bug4 小时前
六级第一关——下楼梯
算法
Morri34 小时前
[Java恶补day53] 45. 跳跃游戏Ⅱ
java·算法·leetcode
林木辛4 小时前
LeetCode热题 15.三数之和(双指针)
算法·leetcode·双指针
张子夜 iiii4 小时前
实战项目-----Python+OpenCV 实现对视频的椒盐噪声注入与实时平滑还原”
开发语言·python·opencv·计算机视觉
AndrewHZ4 小时前
【3D算法技术】blender中,在曲面上如何进行贴图?
算法·3d·blender·贴图·三维建模·三维重建·pcg
Jared_devin4 小时前
二叉树算法题—— [蓝桥杯 2019 省 AB] 完全二叉树的权值
数据结构·c++·算法·职场和发展·蓝桥杯
困鲲鲲6 小时前
Flask 核心基础:从 路由装饰器 到 __name__ 变量 的底层逻辑解析
python·flask