【Day】LeetCode:134. 加油站,135. 分发糖果,860. 柠檬水找零,406. 根据身高重建队列

文章目录

  • [LeetCode:134. 加油站](#LeetCode:134. 加油站)
  • [LeetCode:135. 分发糖果](#LeetCode:135. 分发糖果)
  • [LeetCode:860. 柠檬水找零](#LeetCode:860. 柠檬水找零)
  • [LeetCode:406. 根据身高重建队列](#LeetCode:406. 根据身高重建队列)

LeetCode:134. 加油站

https://leetcode.cn/problems/gas-station/

思路

  1. 首先,计算每个加油站的净收益,得到全程的总剩余油量:
    (1)如果为负数,则总油量不足以支撑全程,返回 -1。
    (2)如果不为负数,则一定存在一个可行的起点。
  2. 初始化 cur_gas = 0 表示当前累计的剩余油量,start = 0 表示当前试探的起点。
    i = 0 开始遍历每个加油站,将 diff[i] 累加到 cur_gas
    (1)如果 cur_gas 始终非负,说明从当前起点出发能顺利到达当前位置。
    (2)如果 cur_gas < 0 ,意味着从起点到当前位置 i 这一段路程无法完成。此时,将起点设为 i + 1 ,并将 cur_gas 重置为 0,继续向后试探。
    原因 :说明此时起点 starti 的累计净收益为负。那么对于任意一个介于 starti 之间的点 k,从 k 出发到 i 的累计净收益也必然为负。因为从 startk 的累计净收益是非负的,否则在更早之前就会重置起点。】

解答

python 复制代码
class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        diff = [] # 记录每个加油站到下一个加油站剩余油的的净含量
        n = len(gas)

        gas_remain = 0

        for i in range(n):
            gas_remain += gas[i] - cost[i]
            diff.append(gas[i] - cost[i])
        
        if gas_remain < 0: # 如果所有加油站油小于总耗油量,则无法成环
            return -1

        cur_gas = 0
        start = 0

        for i in range(n):
            cur_gas += diff[i]
            if cur_gas < 0:
                start = i + 1
                cur_gas = 0
            
        return start

LeetCode:135. 分发糖果

https://leetcode.cn/problems/candy/description/

思路

通过两次遍历来满足条件。

  1. 每个孩子先发 1 颗糖果。
  2. 从左向右遍历:确保当右边孩子评分高于左边时,右边孩子的糖果数大于左边。
    ratings[i] > ratings[i-1] ,则 candies[i] = candies[i-1] + 1
  3. 从右向左遍历:确保当左边孩子评分高于右边时,左边孩子的糖果数大于右边。
    ratings[i] > ratings[i+1] ,则 candies[i] = max(candies[i], candies[i+1] + 1)

解答

python 复制代码
class Solution:
    def candy(self, ratings: List[int]) -> int:
        n = len(ratings)
        
        candies = [1] * n # 每个孩子至少1颗糖果
        
        # 从左到右
        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], candies[i+1] + 1)
        
        return sum(candies)

LeetCode:860. 柠檬水找零

https://leetcode.cn/problems/lemonade-change/

思路

尽可能用 10 找零。如果找零时 5 不足,则无法找零。

解答

python 复制代码
class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        five = 0
        ten = 0
        for bill in bills:
            if bill == 5: # 收5,不用找零
                five += 1
            elif bill == 10: # 收10,只能用5找零
                five -= 1
                ten += 1
            else: # 收20,可以用5、10找零,优先用10
                if ten > 0:
                    five -= 1
                    ten -= 1
                else:
                    five -= 3
            
            if five < 0: # 改顾客无法找零
                return False
        
        return True

LeetCode:406. 根据身高重建队列

https://leetcode.cn/problems/queue-reconstruction-by-height/

思路

  1. 先将 people 按照身高降序、k升序排列。
  2. 遍历排序后的 people,对于每个人 [h, k],将其插入到 queue 的索引 k 处。因为此时 queue 中已有的所有人身高都 >= 当前人的身高,所以当前人插入到位置 k 后,他前面正好有 k 个人身高都 >= 他。

解答

python 复制代码
class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        people.sort(key=lambda x: (-x[0], x[1])) # 身高降序,k升序
        queue = []
        for p in people:
            # 插入到索引 p[1] 的位置
            queue.insert(p[1], p)
        return queue
相关推荐
AI棒棒牛几秒前
YOLO26改进创新 | 全网首发!VECA弹性核心注意力重塑全局建模,线性复杂度增强检测骨干,嘎嘎创新!
python·yolo·目标检测·yolo26·主干改进
Evand J几秒前
【课题推荐与代码介绍】卡尔曼滤波器正反向估计算法原理与MATLAB实现
开发语言·算法·matlab
DFT计算杂谈4 分钟前
VASP新手入门: IVDW 色散修正参数
linux·运维·服务器·python·算法
庚昀◟12 分钟前
ClaudeCode安装教程,基础使用、进阶推荐
人工智能·python·ai
吃着火锅x唱着歌19 分钟前
LeetCode 962.最大宽度坡
算法·leetcode·职场和发展
deephub23 分钟前
告别脆弱的单体应用,用多智能体网络构建稳定的生产力工具
人工智能·python·大语言模型·多智能体
烟雨江南aabb25 分钟前
Python第六弹:python爬虫篇:什么是爬虫
开发语言·爬虫·python
MomentYY29 分钟前
第 1 篇:Agent 到底是什么?别被概念唬住了
人工智能·python·agent
无限进步_30 分钟前
【C++】C++11的类功能增强与STL变化
java·前端·数据结构·c++·后端·算法
Python大数据分析@36 分钟前
对你而言, Vibe Coding 的乐趣是什么?
python