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

算法记录 | Day35 贪心算法

860.柠檬水找零

思路:

只需要维护三种金额的数量,5,10和20。

有如下三种情况:

  • 情况一:账单是5,直接收下。
  • 情况二:账单是10,消耗一个5,增加一个10
  • 情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5

账单是20的情况,优先消耗一个10和一个5

因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!

所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。

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

406.根据身高重建队列

思路:

1.可以先确定身高维度。将数组按身高从高到低进行排序,身高相同的则按照 k值升序排列。这样排序之后可以确定目前对于第 j 个人来说,前面的 j - 1 个人肯定比他都高。

2.建立一个包含 n 个位置的空队列 queue,按照上边排好的顺序遍历,依次将其插入到第 kj位置上。最后返回新的队列。

406.根据身高重建队列

class Solution:def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:people.sort(key = lambda x: (-x[0],x[1] ))que = []for p in people:que.insert(p[1],p)return que

452. 用最少数量的箭引爆气球

思路:

按开始坐标升序排序需要考虑一种情况:有交集关系的区间中,有的区间结束位置比较早。比如 [0, 6] [1, 2] [4, 5]

,按照开始坐标升序排序的话,如下:

[0 . . . . . 6][1 2][4,5]

第一箭的位置需要进行迭代判断,取区间 [0, 6] [1, 2]中结束位置最小的位置,即arrow_pos = min(points[i][1], arrow_pos),然后再判断接下来的区间是否能够引爆。

而按照结束坐标排序的话,箭的位置一开始就确定了,不需要再改变和判断箭的位置,直接判断区间即可。

按开始位置排序

class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:if not points:return Falsepoints.sort(key=lambda x:x[0])arow_pos = points[0][1]count = 1for i in range(len(points)):if arow_pos < points[i][0]:count += 1arow_pos = points[i][1]else:arow_pos = min(arow_pos, points[i][1])return count

按结束位置排序

class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:if not points:return Falsepoints.sort(key=lambda x:x[1])arow_pos = points[0][1]count = 1for i in range(len(points)):if arow_pos < points[i][0]:count += 1arow_pos = points[i][1]return count
http://www.lryc.cn/news/60858.html

相关文章:

  • coinex // 撮合引擎 逻辑流程 (两种数据源 初始化源和前端源)
  • CentOS7---部署LNMP数据存储到redis
  • Linux中的git命令行
  • 【C++】哈希表:开散列和闭散列
  • C技能树:Hello World
  • TryHackMe-Set(Windows渗透测试 | WinDefender免杀)
  • 信安大佬真的用kali吗?
  • 禁用表单元素:Layui框架下的实践与技巧
  • spring boot 访问HTML
  • WPF教程(四)--Dispatcher
  • ijkplayer 编译增加支持更多的音视频格式
  • TOP命令显示完整命令行信息
  • Spring6从入门到精通 第一章 带你玩转Spring
  • Apache POI 实现用Java操作Excel完成读写操作
  • 改善供应商关系的八种方法
  • 网络安全-CDN绕过寻找真实IP
  • 牛客网 HJ28 素数伴侣【二分图匹配,匈牙利算法】困难
  • 带你畅玩ChatGPT
  • ChatGPT探索系列之六:思考ChatGPT的未来发展趋势和挑战
  • TryHackMe-Year of the Fox(Linux渗透测试)
  • ChatGPT 如何获取API Key
  • 明面抵制,暗中布局 对于AI,马斯克的言行为何如此“割裂”?
  • 【微服务中间件学习】redis基础及项目使用
  • ORA-04021:等待锁定对象时发生超时
  • 【华为OD机试真题 C++】1066 - 新工号中数字的最短长度 | 机试题+算法思路+考点+代码解析
  • 【数字 IC / FPGA】 有关建立/保持时间计算的思考
  • 【Fluent】Run can not be started until validation issues are resolved.
  • 【进阶C语言】有关动态内存管理的经典笔试题(详细图文讲解)
  • 1.Java系列之基础面试题总结
  • Android:usb转232串口通信