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

代码随想录算法训练营第35天 | 860.柠檬水找零 + 406.根据身高重建队列 + 452.用最少数量的箭引爆气球

今日任务

  •  860.柠檬水找零 
  •  406.根据身高重建队列 
  •  452. 用最少数量的箭引爆气球

860.柠檬水找零 - Easy

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

    在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

    每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

    注意,一开始你手头没有任何零钱。

    给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

思路:记录面值为 5 和 10 的零钱张数,直接以代码实现找零逻辑即可。时间复杂度: O(n),空间复杂度: O(1)

class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five = 0, ten = 0, twenty = 0;for (int bill : bills) {// 情况一if (bill == 5) five++;// 情况二if (bill == 10) {if (five <= 0) return false;ten++;five--;}// 情况三if (bill == 20) {// 优先消耗10美元,因为5美元的找零用处更大,能多留着就多留着if (five > 0 && ten > 0) {five--;ten--;twenty++; // 其实这行代码可以删了,因为记录20已经没有意义了,不会用20来找零} else if (five >= 3) {five -= 3;twenty++; // 同理,这行代码也可以删了} else return false;}}return true;}
};

406.根据身高重建队列 - Medium

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

    假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

    请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

思路:题目有两个维度,一定要想如何确定一个维度,然后再按照另一个维度重新排列。按照身高h来排序,前面的节点一定都比本节点高,身高相同k小的在前面;按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成队列,时间复杂度:O(nlog n + n^2),空间复杂度:O(n)

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());}
};

 

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

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

    有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。

    一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足  xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

    给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。

思路:当气球出现重叠,一起射,所用弓箭最少;为了让气球尽可能的重叠,需要对数组进行排序,如果按照起始位置排序,那么就从前向后遍历气球数组,靠左尽可能让气球重复;如果气球重叠了,重叠气球中右边边界的最小值 之前 的区间一定需要一个弓箭。时间复杂度:O(nlog n),因为有一个快排,空间复杂度:O(1),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间

class Solution {
private: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;}
};

今日总结

第三题注意题目中说的是:满足 xstart ≤ x ≤ xend,则该气球会被引爆。那么说明两个气球挨在一起不重叠也可以一起射爆,

所以代码中 if (points[i][0] > points[i - 1][1]) 不能是>=

 

 

相关文章:

  • [GN] 设计模式——面向对象设计原则概述
  • 【游戏服务器部署】幻兽帕鲁服务器一键部署保姆级教程,游戏私服还是自己搭建的香
  • 全球工控大佬
  • 基于 NXP S32K311 评估板的方案
  • 网站打不开怎么办?高防IP弹性防护更省心
  • redis主从复制薪火相传
  • Mysql 删除数据
  • Java枚举enum:让你的编程效率翻倍的神级工具!
  • 基于GPT3.5逆向 和 本地Bert-Vits2-2.3 的语音智能助手
  • 微信小程序canvs画布修改元素线条粗细、颜色、填充状态
  • 基于Prompt Learning的信息抽取
  • C#设置程序开机启动
  • 将Android APP安装到sm8550 HDK的NVMe SSD
  • 命令行启动Android Studio模拟器
  • Redis系列-数据结构篇
  • [译] React v16.8: 含有Hooks的版本
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 5、React组件事件详解
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Javascript设计模式学习之Observer(观察者)模式
  • markdown编辑器简评
  • MySQL用户中的%到底包不包括localhost?
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 测试如何在敏捷团队中工作?
  • 程序员该如何有效的找工作?
  • 浮现式设计
  • 搞机器学习要哪些技能
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 机器学习中为什么要做归一化normalization
  • 收藏好这篇,别再只说“数据劫持”了
  • 写给高年级小学生看的《Bash 指南》
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​比特币大跌的 2 个原因
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ​学习一下,什么是预包装食品?​
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (12)Linux 常见的三种进程状态
  • (7)STL算法之交换赋值
  • (Git) gitignore基础使用
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)c52学习之旅-流水LED灯
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转载)hibernate缓存
  • ./configure、make、make install 命令
  • .apk文件,IIS不支持下载解决
  • .bat批处理(一):@echo off
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET MVC之AOP
  • .net的socket示例