leetcode刷题-贪心03

代码随想录贪心算法part03|134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列

134. 加油站【太牛了】

leetcode题目链接
代码随想录文档讲解

思路

两个数组:

gas

cost

diff(当前站点的的累计剩余油量)

新建变量:currsum,一旦它小于0,就从它的下一个站点开始重新记,因为这个站点前面的currsum是大于0的,舍弃前面的站点不会起作用,即前面哪一个站点作为起始站点都不行,尝试i+1。

视频有一堆很牛的反证法证明了我疑惑的地方(区间1+区间2<0,但区间1<0,区间2>0,这个时候已经选取区间1后的第一个位置作为起始点了,而不是区间2后的第一个位置,符合解题逻辑)

python代码

python 复制代码
class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        currsum, totalsum, index = 0, 0, 0
        for i in range(len(gas)):
            currsum += gas[i] - cost[i]
            totalsum += gas[i] - cost[i]
            if currsum < 0:
                index = i + 1
                currsum = 0
        if totalsum < 0:
            return -1
        else:
            return index

135. 分发糖果

leetcode题目链接
代码随想录文档讲解

左右分别判断

python 复制代码
class Solution:
    def candy(self, ratings: List[int]) -> int:
        candy = [1 for i in range(len(ratings))]
        for i in range(1, len(ratings)):
            if ratings[i] > ratings[i-1]:
                candy[i] = candy[i-1] + 1
        for i in range(len(ratings)-2, -1, -1):
            if ratings[i] > ratings[i+1]:
                candy[i] = max(candy[i], candy[i+1] + 1)
        return sum(candy)

860.柠檬水找零

leetcode题目链接
代码随想录文档讲解

贪心策略:优先用大的钞票找零

情况1: 支付5元

情况2: 支付10元(找零5元)

情况3: 支付20元(两种找零策略,优先使用10元+5元)

python 复制代码
class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        five, ten, twenty = 0, 0, 0
        for bill in bills:
            if bill == 5:
                five += 1
            if bill == 10:
                if five <= 0:
                    return False
                else:
                    ten += 1
                    five -= 1
            if bill == 20:
                if ten > 0 and five > 0:
                    ten -= 1
                    five -= 1
                    twenty += 1
                elif five >= 3:
                    five -= 3
                    twenty += 1
                else:
                    return False
        return True

406.根据身高重建队列

leetcode题目链接
代码随想录文档讲解

与分发糖果类似,本题也有两个维度:h、k,先确定一个维度再确定另一个维度

先从大到小排序h,确定好身高顺序,再遍历检查k,让队列满足k的熟悉(将身高小的插入到前面,这样也不会影响身高大的的位置)

使用python的sorted函数,使用lambda表达式,key确定排序依据,例如:

python 复制代码
# 假设这是你的列表
my_list = [[1, 5], [3, 2], [4, 8], [2, 3]]

# 根据每个小列表的第二个数字降序排序
sorted_list = sorted(my_list, key=lambda x: x[1], reverse=True)

print(sorted_list)

在写按照k进行排序插入的代码时也不用再计算应该插入的位置,其实就是插入到第k个位置,因为已经排好序了,这里又蠢了呜呜

python 复制代码
class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
    	# 先按照h维度的身高顺序从高到低排序。确定第一个维度
        # lambda返回的是一个元组:当-x[0](维度h)相同时,再根据x[1](维度k)从小到大排序
        people.sort(key=lambda x: (-x[0], x[1]))
        que = []
	
	# 根据每个元素的第二个维度k,贪心算法,进行插入
        # people已经排序过了:同一高度时k值小的排前面。
        for p in people:
            que.insert(p[1], p)
        return que
相关推荐
_poplar_3 分钟前
09 【C++ 初阶】C/C++内存管理
c语言·开发语言·数据结构·c++·git·算法·stl
2501_924747112 小时前
驾驶场景玩手机识别准确率↑32%:陌讯动态特征融合算法实战解析
人工智能·算法·计算机视觉·智能手机
limitless_peter2 小时前
优先队列,链表优化
c++·算法·链表
屁股割了还要学4 小时前
【数据结构入门】栈和队列
c语言·开发语言·数据结构·学习·算法·青少年编程
Monkey的自我迭代4 小时前
支持向量机(SVM)算法依赖的数学知识详解
算法·机器学习·支持向量机
阿彬爱学习5 小时前
AI 大模型企业级应用落地挑战与解决方案
人工智能·算法·微信·chatgpt·开源
L.fountain6 小时前
配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
算法·配送
是乐谷8 小时前
饿了么招java开发咯
java·开发语言·人工智能·程序人生·面试·职场和发展
啊阿狸不会拉杆9 小时前
《算法导论》第 13 章 - 红黑树
数据结构·c++·算法·排序算法
qiuyunoqy9 小时前
蓝桥杯算法之搜索章 - 3
c++·算法·蓝桥杯·深度优先·dfs·剪枝