Day21:贪心算法 | 加油站,分发糖果

1.134加油站

一开始没明白为什么换起点和最终Total_tank>=0就能保证整个路途都是有油的。

比喻成债务就突然明白了,果然还是对金钱敏感一些

  1. 注意:真正决定汽车能否走完全程只取决于差值数组 gas-cost ,gas,cost只是中间数据
  2. 汽车加油--->合伙还债
    1. 从第一个人开始,每个人可能欠钱或者有钱
    2. 遇到欠钱就跳过(这里体现贪心算法思维),但计算总债务(total_tank)
    3. 从A有钱到B没钱了,说明A到B总体是欠钱的,跳过
    4. 直到找到那个最有可能cover总账的"大佬"
      1. 如果最后total_tank>=0,说明这群人是可以还债的,也就是大佬能平债务
      2. 所以要从大佬开始,就可以拿着大佬的钱去还之前跳过的债务(用盈利覆盖前面的亏损
python 复制代码
class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        n = len(gas)
        curr_tank = 0
        total_tank = 0
        start = 0
        for i  in range(n):
            net = gas[i] - cost[i] #net gain指净收益
            curr_tank += net
            total_tank += net
            if curr_tank < 0:
                start = i + 1
                curr_tank = 0
        
        return start if total_tank >= 0 else -1

2.135分发糖果

看到这题想到了接雨水那道题,果然题解也使用了双向扫描( 因为问题中的每个位置都受到两个方向的限制,一次遍历无法确定最终值)。

正向遍历:保证右孩子评分高糖果多,反向遍历,保证左孩子评分高糖果多,两者取max求和,就是最终糖果数。

python 复制代码
class Solution:
    def candy(self, ratings: List[int]) -> int:
        n = len(ratings)
        candies = [1] * n

        for i in range(1, n):
            if ratings[i] > ratings[i-1]:
                candies[i] = candies[i-1] + 1
        
        for i in range(n-2, -1, -1):
            if ratings[i] > ratings[i+1]:
                candies[i] = max(candies[i+1] + 1, candies[i])
        
        return sum(candies)

3.860柠檬水找零

看到题解用five和ten两个变量记录个数就行。

python 复制代码
class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        change_map = {5:0,10:0,20:0}
        for num in bills:
            if num == 5:
                change_map[5] += 1
            elif num == 10:
                if change_map[5] == 0:
                    return False
                change_map[5] -= 1
                change_map[10] += 1
            else:
                if change_map[10] != 0 and change_map[5] != 0:
                    change_map[10] -= 1
                    change_map[5] -= 1
                elif change_map[10] == 0 and change_map[5] > 2:
                    change_map[5] -= 3
                else:
                    return False
        
        return True

4.406根据身高重建队列

先从高到矮排序,再插入

这样插入的时候就不会影响高个子的k值,矮个子插入的位置正好就是k值

  1. sort()的用法
  2. sort时身高从高到矮,插入时从矮到高
python 复制代码
class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        people.sort(key=lambda x : (-x[0], x[1]))
        res = []
        for p in people:
            res.insert(p[1],p)
        return res
相关推荐
Lumos18610 分钟前
51单片机从零到实战(完结)——后续学习路线建议
算法
稚南城才子,乌衣巷风流15 分钟前
DFS序详解:原理、应用与实现
算法·深度优先·图论
稚南城才子,乌衣巷风流20 分钟前
动态树(Dynamic Tree)数据结构详解
数据结构·算法
变量未定义~1 小时前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗1 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
LONGZETECH1 小时前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
自学小白菜1 小时前
关于提升机器学习算法做预测回归任务精度的方法分享
算法·机器学习·回归·提升精度
学废了wuwu2 小时前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
小肝一下2 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月2 小时前
监督学习算法 之 决策树
学习·算法·决策树