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
相关推荐
im_AMBER27 分钟前
算法笔记 05
笔记·算法·哈希算法
夏鹏今天学习了吗33 分钟前
【LeetCode热题100(46/100)】从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
吃着火锅x唱着歌33 分钟前
LeetCode 2389.和有限的最长子序列
算法·leetcode·职场和发展
嶔某1 小时前
二叉树的前中后序遍历(迭代)
算法
007php0071 小时前
百度面试题解析:微服务架构、Dubbo、Redis及其一致性问题(一)
redis·百度·docker·微服务·容器·职场和发展·架构
WWZZ20251 小时前
快速上手大模型:机器学习2(一元线性回归、代价函数、梯度下降法)
人工智能·算法·机器学习·计算机视觉·机器人·大模型·slam
孤狼灬笑1 小时前
深度学习经典分类(算法分析与案例)
rnn·深度学习·算法·cnn·生成模型·fnn
dragoooon341 小时前
[优选算法专题四.前缀和——NO.26二维前缀和]
算法
苏小瀚2 小时前
算法---位运算
java·算法
Code小翊2 小时前
归并排序基础理解
数据结构·算法·排序算法