当前位置: 首页 > article >正文

leetcode刷题-贪心03

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

  • 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代码

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题目链接
代码随想录文档讲解

左右分别判断

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元)

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确定排序依据,例如:

# 假设这是你的列表
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个位置,因为已经排好序了,这里又蠢了呜呜

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

http://www.kler.cn/a/522964.html

相关文章:

  • QT 通过ODBC连接数据库的好方法:
  • postgres基准测试工具pgbench如何使用自定义的表结构和自定义sql
  • Fullcalendar @fullcalendar/react 样式错乱丢失问题和导致页面卡顿崩溃问题
  • CSAPP学习:前言
  • c++贪心
  • *胡闹厨房*
  • 磁盘调度算法
  • 【PySide6快速入门】 QRadioButton单选按钮
  • 全程Kali linux---CTFshow misc入门
  • Python-基于PyQt5,json和playsound的通用闹钟
  • 汉语向编程指南
  • LeetCode:62.不同路径
  • 开发者交流平台项目部署到阿里云服务器教程
  • 【Redis】hash 类型的介绍和常用命令
  • 编解码技术:最大秩距离码(Maximum Rank Distance Code)
  • 代码随想录刷题day18|(哈希表篇)01.两数之和
  • QT:图像上绘制图形
  • 基于Django的个人博客系统的设计与实现
  • 【现代深度学习技术】深度学习计算 | 参数管理
  • Flink (十三) :Table API 与 DataStream API 的转换 (一)
  • TypeScript 学习 -类型 - 9
  • MySQL知识点总结(十二)
  • 树和图的实现与应用:C语言实践详解
  • Docker/K8S
  • C语言中的do……while和while循环有什么区别?
  • MySQL事物,MVCC机制