代码随想录算法训练营第36期DAY37

news2024/11/24 20:09:21

DAY37

先二刷昨天的3道题目,每种方法都写:是否已完成:是。

报告:134加油站的朴素法没写对。原因是:在if中缺少了store>=0的判断,只给出了index==i的判断。前进法没写出来。因为忘记了总油量的判断。Sum。注意变量的初始化。分配糖果注意if里面放的是ratings;

860柠檬水找零

网上摘得思路,看来我还是得冷静下来多想多模拟,最好把文字思路写下来,慢慢打磨:

思路:

  1. 遇10元要消耗5元数量,遇到20元可消耗10元和5元数量,由于要保证后面还可能需要5元
    2. 那么,遇到20元时就要优先消耗10元的数量

  1. class Solution {
  2. public:
  3.     bool lemonadeChange(vector<int>& bills) {
  4.         int five=0,ten=0,twenty=0;
  5.         for(int bill:bills){
  6.             if(bill==5) five++;
  7.             else if(bill==10){
  8.                 if(five==0return false;
  9.                 five--,ten++;
  10.             }
  11.             else if(bill=20){
  12.                 if(ten>0&&five>0){
  13.                     ten--,five--,twenty++;
  14.                 }
  15.                 else if(five>=3){
  16.                     five-=3,twenty++;
  17.                 }
  18.                 else 
  19.                     return false;
  20.             }
  21.         }
  22.         return true;
  23.     }
  24. };

406根据身高重建队列

想不出来,不知道该怎么模拟。

力扣博主Sunny的题解:

渔(套路):一般这种数对,还涉及排序的,根据第一个元素正向排序,根据第二个元素反向排序,或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化解题过程。

在本题目中,我首先对数对进行排序,按照数对的元素 1 降序排序,按照数对的元素 2 升序排序。原因是,按照元素 1 进行降序排序,对于每个元素,在其之前的元素的个数,就是大于等于他的元素的数量,而按照第二个元素正向排序,我们希望 k 大的尽量在后面,减少插入操作的次数。

作者:Sunny

链接:https://leetcode.cn/problems/queue-reconstruction-by-height/solutions/486493/xian-pai-xu-zai-cha-dui-dong-hua-yan-shi-suan-fa-g/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

讲得非常好,我们自己编程实现一下:

不会语法。

很好,学到新东西了,尤其是重载pair类运算符,还有insert记得传入res.begin()的写法:

  1. class Solution {
  2. public:
  3.     //注意person是vector<int> 不是pair.因为是对内部的元素排,而内部元素是vector<int>类型
  4.     static bool mycmp(vector<int>&a,vector<int>&b){
  5.         if(a[0]==b[0]) return a[1]<b[1];
  6.         return a[0]>b[0];
  7.     }
  8.     vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
  9.         vector<vector<int>> res;
  10.         sort(people.begin(),people.end(),mycmp);
  11.         for(auto person:people){
  12.             int size=(int)res.size();
  13.             if(person[1]>=size)
  14.                 res.push_back(person);
  15.             else 
  16.                res.insert(res.begin()+person[1],person); 
  17.             
  18.         }
  19.         return res;
  20.     }
  21. };

学习代码随想录的解法:

引用:

“本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。在135. 分发糖果 (opens new window)我就强调过一次,遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。”

思路一样的,但是讲解的话,力扣博主要更清晰易懂,以后优先看力扣博主的讲解,都吸收。

这里相当于再写一遍:

  1. class Solution {
  2. public:
  3.     static bool mycmp(vector<int>&a,vector<int>&b){
  4.         if(a[0]==b[0]) return a[1]<b[1];
  5.         return a[0]>b[0];
  6.     }
  7.     vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
  8.         vector<vector<int>> res;
  9.         sort(people.begin(),people.end(),mycmp);
  10.         for(auto person :people){
  11.             int size=(int)(res.size());
  12.             if(person[1]>=size) res.push_back(person);
  13.             else res.insert(res.begin()+person[1],person);
  14.         }
  15.         return res;
  16.     }
  17. };

还需要额外学习手写vector的insert操作:

  1. void insert(vector<int>& vec, int pos, int val) {
  2.     // Check if the position is valid
  3.     if (pos < 0 || pos > vec.size()) {
  4.         throw invalid_argument("Position is out of range.");
  5.     }
  6.     // Increase the size of the vector
  7.     vec.resize(vec.size() + 1);
  8.     // Move the elements after the position to create space for the new element
  9.     for (int i = vec.size() - 1; i > pos; i--) {
  10.         vec[i] = vec[i - 1];
  11.     }
  12.     // Insert the new element
  13.     vec[pos] = val;
  14. }

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

本题考察区间合并,在ACWING学了模版,但是已经记不起来了,还是得多学多做多复习(显然不太可能,尽力吧):

还是写不出来区间合并。仔细读题,这题并不是单纯的区间合并

复习ACWING区间合并,学习记忆ACWING模版,力扣高赞题解,代码随想录题解、COZE的解法(主要还是要学会区间合并,COZE的解法并不能走天下)。已完成。

COZE:

注意先sort再去取end;

  1. class Solution {
  2. public:
  3.     static bool mycmp(vector<int>&a,vector<int>&b){
  4.         return a[1]<b[1];
  5.     }
  6.     int findMinArrowShots(vector<vector<int>>& points) {
  7.         sort(points.begin(),points.end(),mycmp);
  8.         int res=1,end=points[0][1];
  9.         for(int i=1;i<points.size();i++){
  10.             if(points[i][0]<=end) continue;
  11.             res++;
  12.             end=points[i][1];
  13.         }
  14.         return res;
  15.     }
  16. };

Leetcode优质题解:

思路和上面一样:有交集就好,没交集就res++,并更新end;

代码随想录官方题解:

学到了:如果按左端点来排序,那么应当从后向前开始遍历。遇到重叠时候:重叠气球的最小右边界就是射箭地方。

  1. class Solution {
  2. public:
  3.     static bool mycmp(vector<int>&a,vector<int>&b){
  4.         return a[0]<b[0];
  5.     }
  6.     int findMinArrowShots(vector<vector<int>>& points) {
  7.         int result=1;
  8.         sort(points.begin(),points.end(),mycmp);
  9.         for(int i=1;i<points.size();i++){
  10.             //不重叠
  11.             if(points[i][0]>points[i-1][1]){
  12.                 result++;
  13.             }
  14.             //重叠
  15.             else{
  16.                 points[i][1]=min(points[i][1],points[i-1][1]);
  17.             }
  18.         }
  19.         return result;
  20.     }
  21. };

ACWING803区间合并

有很多细节:-2e9,注意负号的位置。

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=100010;
  6. typedef pair<int,int> PII;
  7. vector<PII> segs;
  8. //看一下const N怎么用的?
  9. void mymerge(vector<PII>&segs){
  10.     sort(segs.begin(),segs.end());
  11.     vector<PII> res;
  12.     int st=-2e9,ed=-2e9;
  13.     for(auto seg:segs){
  14.         //无交集
  15.         if(ed<seg.first){
  16.             if(st!=-2e9) res.push_back({st,ed});
  17.             st=seg.first,ed=seg.second;
  18.         }
  19.         //有交集
  20.         else{
  21.             ed=max(seg.second,ed);
  22.         }
  23.     }
  24.     //防止空区间进入
  25.     if(st!=-2e9) res.push_back({st,ed});
  26.     segs=res;
  27. }
  28. int main(){
  29.     int n;
  30.     scanf("%d",&n);
  31.     while(n--){
  32.         int l,r;
  33.         scanf("%d%d",&l,&r);
  34.         segs.push_back({l,r});
  35.     }
  36.     mymerge(segs);
  37.     printf("%d\n",segs.size());
  38.     return 0;
  39. }

学习贪心算法:

来源:

[一个视频搞懂贪心算法]

(https://www.bilibili.com/video/BV1Hz4y117CP/?share_source=copy_web&vd_source=20ecc36fbdd0ac45969ae149b0333409)

  1. 分配问题。

分配饼干,因为饥饿度最小的孩子最容易吃饱,先考虑他。

做过了。

  1. 区间问题-Leetcode435 无重叠区间

在选择要保留区间时,区间的结尾十分重要:选择的区间结尾越小,余留给其它区间的空间就越大,就越能保留更多的区间。

因此,我们采取的贪心策略为,优先保留结尾小且不相交的区 间。具体实现方法为,先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选 择的区间不重叠的区间。

给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠。

  1. class Solution {
  2. public:
  3.     static bool mycmp(vector<int>&a,vector<int>&b){
  4.         return a[1]<b[1];
  5.     }
  6.     int eraseOverlapIntervals(vector<vector<int>>& intervals) {
  7.         int remove=0;
  8.         sort(intervals.begin(),intervals.end(),mycmp);
  9.         int end=intervals[0][1];
  10.         for(int i=1;i<intervals.size();i++){
  11.             if(intervals[i][0]<end) {
  12.                 remove++;
  13.                 continue;
  14.             }
  15.             end=intervals[i][1];
  16.         }
  17.         return remove;
  18.     }
  19. };

做出来了!不会也别怕,做过类似的就增长能力了,下次就能举一反三。

  1. 买卖股票的最佳时机 Leetcode121,简单

又不会了,因为当时没彻底弄懂吧。

朴素法,超时了:

  1. class Solution {
  2. public:
  3.     int maxProfit(vector<int>& prices) {
  4.         int res=INT_MIN;
  5.         for(int i=0;i<prices.size()-1;i++){
  6.          int j=i+1;
  7.          while(j<prices.size()){
  8.             int tmp=prices[j]-prices[i];
  9.             if(tmp>res) res=tmp;
  10.             j++;
  11.          }
  12.         }
  13.         if(res<0return 0;
  14.         return res;
  15.     }
  16. };

动态规划:画图!

  1. class Solution {
  2. public:
  3.     int maxProfit(vector<int>& prices) {
  4.         int pastprice=INT_MAX,res=0;
  5.         for(int price:prices){
  6.             res=max(res,price-pastprice);
  7.             pastprice=min(price,pastprice);
  8.         }
  9.         return res;
  10.     }
  11. };

  1. 买卖股票的最佳时机ii,中等

画图发现,[1,4,6]不管是{1买入,4卖出;4买入,6卖出}还是{1买入,6卖出}结果一样,所以每日res>0的话就加入到结果中:如果今天买明天卖能赚钱,那么就今天买入。

  1. class Solution {
  2. public:
  3.     int maxProfit(vector<int>& prices) {
  4.         if(prices.size()==1return 0;
  5.         int pro=0;
  6.         for(int i=1;i<prices.size();i++){
  7.             int res=prices[i]-prices[i-1];
  8.             if(res>0) pro+=res;
  9.         }
  10.         return pro;
  11.     }
  12. };

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1685870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Vue的自定义服务说明弹窗组件的设计与实现

基于Vue的自定义服务说明弹窗组件的设计与实现 摘要 随着技术的不断发展&#xff0c;前端开发面临着越来越高的复杂性和不断变化的需求。传统开发方式往往将整个系统构建为整块应用&#xff0c;这导致对系统的任何微小改动都可能触发整体的逻辑变更&#xff0c;从而增加了开发…

第二证券:见证历史!印度这一交易所市值突破5万亿美元

又一次见证前史&#xff01; 孟买证券交易所本周实现了一个重要的里程碑&#xff0c;其市值突破5万亿美元&#xff0c;总市值在不到6个月的时间里添加了1万亿美元。 据了解&#xff0c;印度股市两大交易所别离为孟买证券交易所&#xff08;BSE&#xff09; 和国家证券交易所&…

discuzX2.5的使用心得 札记一

从开始接受php论坛的开发任务&#xff0c;对php感兴趣的我开始迷恋上discuz这个产品了&#xff0c; 像戴志康这样的创新人才&#xff0c;是我们这代人的骄傲和学习的榜样 应该是了解一下&#xff0c;啥事discuzX2.5&#xff0c;百度看一下 discuz x2.5_百度百科 看完百度词条…

如何通过软件IIC使用MPU6050陀螺仪

目录 1. MPU6050简介 2. MPU6050参数 3. MPU6050硬件电路 4. 代码编写 4.1 MPU6050写寄存器 4.2 MPU6050读寄存器 4.3 初始化 4.4 MPU6050获取ID号 4.5 MPU6050获取数据 1. MPU6050简介 MPU6050是一个6轴姿态传感器&#xff0c;可以测量芯片自身X、Y、Z轴的…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(七):快启

前言: 汽车仪表是人们了解汽车状况的窗口,而仪表中的大部分信息都是以指示灯形式显示给驾驶者。仪表指示灯图案都较为抽象,对驾驶不熟悉的人在理解仪表指示灯含义方面存在不同程度的困难,尤其对于驾驶新手,如果对指示灯的含义不求甚解,有可能影响驾驶的安全性。即使是对…

关于新配置的adb,设备管理器找不到此设备问题

上面页面中一开始没有找到此android设备&#xff0c; 可能是因为我重新配置的adb和设备驱动&#xff0c; 只把adb配置了环境变量&#xff0c;驱动没有更新到电脑中&#xff0c; 点击添加驱动&#xff0c; 选择路径&#xff0c;我安装时都放在了SDK下面&#xff0c;可以尝试…

怎么查看公网IP?

在网络通信中&#xff0c;每个设备都会被分配一个IP地址&#xff0c;用于在互联网上进行唯一标识和通信。公网IP是指可以被公开访问的IP地址&#xff0c;可以用来建立远程连接或者进行网络访问等操作。怎么查看公网IP呢&#xff1f;下面将介绍几种常用的方法。 使用命令行查询公…

mainwindow.ui和mainwindow.h和ui_mainwindow.h这几个文件之间的联系是什么

在Qt应用程序开发中&#xff0c;mainwindow.ui, mainwindow.h, 和 ui_mainwindow.h 这三个文件之间有着紧密的联系&#xff0c;共同构成了使用Qt Designer设计的图形用户界面&#xff08;GUI&#xff09;应用程序的基础。下面是这三个文件各自的作用及它们之间的关联&#xff1…

linux day7 wget,curl

wget下载命令 curl [-O] 网址 不写-O表示请求网址&#xff0c;会返回网页html代码 写-O表示请求下载网页文件

基于因果图的灰度故障定位

简 介 本文介绍由南开大学、华为技术有限公司、清华大学共同合作的论文&#xff1a;面向服务器操作系统的非侵入式灰度故障定位。该论文已被The ESEC/FSE Conference 2024&#xff08;The ACM Joint European Software Engineering Conference and Symposium on the Foundatio…

【易生支付官网注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

mybatisPlus-DB静态工具

方法跟mybatisplus的service接口非常像&#xff0c;静态工具可以避免依赖循环注入。

异步爬虫学习实战项目:水效标识网

大家好&#xff0c;我是南枫&#xff0c;今天一起来学习异步爬虫。 文章开始之前&#xff0c;我们先搞清楚为什么要学异步爬虫&#xff1f;我们之后在工作中会遇到爬大量数据&#xff0c;比如百万数据采集&#xff0c;用平常的方法爬取的效率会比较低&#xff0c;所以要学习异…

React 其他 Hooks

其他 Hooks useRef 可用于获取 DOM 元素 const ScrollRef useRef(null)ScrollRef.current useContext &#xff08;先回顾一下之前的 Context 知识&#xff0c;借用之前 ppt 和源码&#xff09; Hooks 中使用 useContext 来获取 context 的值 // 父组件创建 contextexpor…

在MySQL数据库中的视图和事务。

视图 view 临时表 作用&#xff1a;优化多表查询的效率 可以将经常使用的连接查询结果使用视图进行保存&#xff0c;避免多次重复的笛卡尔积运算 MySQL数据库在多表查询的时候会自动进行笛卡尔积运算。 如果将来经常要用到某一个多表查询的结果就可以使用视图将这个结果…

Android 观察者模式(OBSERVER)应用详解

文章目录 1、观察者模式设计初衷1.1. 解耦对象之间的依赖关系1.2. 允许动态的依赖关系1.3. 自动通知和更新1.4 设计初衷的详细说明1. 对象之间的解耦2. 动态依赖关系3. 自动更新 2、实现细节2.1. Subject 接口和实现2.2. Observer 接口和实现2.3. 主类 3、主要角色4、关系示意图…

Nginx - Stream 日志模块不完全指北

文章目录 Pre官网Nginx Stream模块基础功能Nginx Stream访问日志的缺陷解决方案或替代方案安装和配置nginx-log-enhancement模块1. 下载nginx-log-enhancement模块源代码2. 解压源代码3. 配置Nginx源代码4. 编译和安装Nginx5. 配置nginx-log-enhancement模块6. 重启Nginx7. 测试…

I/O '24|学习资源焕新,技术灵感升级

2024 年 5 月 15 日凌晨举行的 Google I/O 大会为各地的开发者们带来了新的灵感。面对技术革新&#xff0c;相信各位开发者们都迫不及待想要自己上手试一试。 别急&#xff0c;Google 谷歌今年为中国的开发者们准备了一份特别的学习资源&#xff0c;让开发者们自由探索新知。 G…

RedisTemplate操作Redis, 看这一篇文章就够了

文章目录 1. String 命令1.1 添加缓存1.2 设置过期时间(单独设置)1.3 获取缓存值1.4 删除key1.5 顺序递增1.6 顺序递减1.7 常用的 2. Hash命令2.1 添加缓存2.2 设置过期时间(单独设置)2.3 添加一个Map集合2.4 提取所有的小key2.5 提取所有的value值2.6 根据key提取value值2.7 获…

【VTKExamples::Texture】第六期 TextureThreshold

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TextureThreshold,并解析接口vtkTexture,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~Y…