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

DAY35:贪心算法part4、860\406\452

Leetcode: 860 柠檬水找零

有如下三种情况:

情况一:账单是5,直接收下。

情况二:账单是10,消耗一个5,增加一个10

情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5

唯一不确定的其实在情况三。

账单是20的情况,为什么要优先消耗一个10和一个5呢?

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

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

class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five = 0, ten = 0, twenty = 0;for(int i = 0; i < bills.size(); i++){if(bills[i] == 5) five++;//统计5元的数量if(bills[i] == 10){//统计5、10元的数量if(five <= 0) return false;ten++;five--;}if(bills[i] ==20){//20找0的先后顺序if(five <= 0) return false;if(ten > 0){ten--;five--;}else{if(five <= 2) return false;else five = five - 3;}}} return true;}
};

Leetcode: 406 根据身高重建队列

当出现两个维度的数值进行贪心的时候,我们需要注意两个维度一定要有先后顺序,不然容易顾此失彼。这道题目先对身高进行从高到低的排序,然后再考虑第二维的前后顺序问题。

代码随想录

时间复杂度:O(nlog n + n^2)

空间复杂度:O(n)

使用数组来实现

用数组会不断的移动元素,复杂度会比实际的要高,因此可以尝试链表来实现

class Solution {
public:static bool cmp(const vector<int>& a, const vector<int>& b) {if (a[0] == b[0]) return a[1] < b[1];return a[0] > b[0];}vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort (people.begin(), people.end(), cmp);vector<vector<int>> que;for (int i = 0; i < people.size(); i++) {int position = people[i][1];que.insert(que.begin() + position, people[i]);}return que;}
};

使用链表来实现

class Solution {
public:// 身高从大到小排(身高相同k小的站前面)static bool cmp(const vector<int>& a, const vector<int>& b) {if (a[0] == b[0]) return a[1] < b[1];return a[0] > b[0];}vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort (people.begin(), people.end(), cmp);list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多for (int i = 0; i < people.size(); i++) {int position = people[i][1]; // 插入到下标为position的位置std::list<vector<int>>::iterator it = que.begin();while (position--) { // 寻找在插入位置it++;}que.insert(it, people[i]);}return vector<vector<int>>(que.begin(), que.end());}
};

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

当气球出现重叠的时候,一起射,使用箭的数量最少。

如果把气球排序之后,从前到后遍历气球,被射过的气球跳过,记录一下箭的数量就可以了。

但是比较考验代码功底

class Solution {
static bool cmp(const vector<int>& a, const vector<int>& b) {return a[0] < b[0];
}
public:int findMinArrowShots(vector<vector<int>>& points) {if (points.size() == 0) return 0;sort(points.begin(), points.end(), cmp);int result = 1; // points 不为空至少需要一支箭for (int i = 1; i < points.size(); i++) {if (points[i][0] > points[i - 1][1]) {  // 气球i和气球i-1不挨着,注意这里不是>=result++; // 需要一支箭}else {  // 气球i和气球i-1挨着points[i][1] = min(points[i - 1][1], points[i][1]); // 更新重叠气球最小右边界}}return result;}
};

相关文章:

  • 【Docker】docker安装jenkins
  • python数据生成excel文件实现
  • uniapp中mescroll的使用
  • 医院如何筛选安全合规的内外网文件交换系统?
  • uniapp如何添加多个表单数组?
  • iPhone 14支持NFC吗?如果支持,那么怎么启用
  • 华为radius认证
  • Qt 信号与槽
  • 时序数据库 Tdengine 执行命令能够查看执行的sql语句
  • Matlab plot绘图的 title 语法
  • 前端怎么监听手机键盘是否弹起
  • QGIS编译(跨平台编译)之二十七:giflib编译(Windows、Linux、MacOS环境下编译)
  • 高考复习技巧考研资料、美赛论文及代码,数据收集网站(初高中招生考试全科试卷等)
  • 视觉检测系统:工厂生产零部件的智能检测
  • protobuf-go pragma.go 文件介绍
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  •  D - 粉碎叛乱F - 其他起义
  • Electron入门介绍
  • js递归,无限分级树形折叠菜单
  • Logstash 参考指南(目录)
  • Vue 动态创建 component
  • 多线程 start 和 run 方法到底有什么区别?
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 我的面试准备过程--容器(更新中)
  • 用jquery写贪吃蛇
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • # Panda3d 碰撞检测系统介绍
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (rabbitmq的高级特性)消息可靠性
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .gitignore文件---让git自动忽略指定文件
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net Memory Profiler的使用举例
  • .NET Micro Framework 4.2 beta 源码探析
  • .net(C#)中String.Format如何使用
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET值类型变量“活”在哪?
  • .Net中的集合
  • @PreAuthorize注解
  • [20161214]如何确定dbid.txt