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

代码随想录算法训练营day29

代码随想录算法训练营

—day29

文章目录

  • 代码随想录算法训练营
  • 前言
  • 一、134. 加油站
    • 暴力解法
    • 贪心算法
  • 二、135. 分发糖果
  • 三、860. 柠檬水找零
  • 四、406.根据身高重建队列
    • vector版
    • list版
  • 总结


前言

今天是算法营的第29天,希望自己能够坚持下来!
今日任务:
● 134. 加油站
● 135. 分发糖果
● 860.柠檬水找零
● 406.根据身高重建队列


一、134. 加油站

题目链接
文章讲解
视频讲解

暴力解法

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {for (int i = 0; i < cost.size(); i++) {int rest = gas[i] - cost[i]; // 记录剩余油量int index = (i + 1) % cost.size();while (rest > 0 && index != i) { // 模拟以i为起点行驶一圈(如果有rest==0,那么答案就不唯一了)rest += gas[index] - cost[index];index = (index + 1) % cost.size();}// 如果以i为起点跑一圈,剩余油量>=0,返回该起始位置if (rest >= 0 && index == i) return i;}return -1;}
};

贪心算法

思路:

  1. 如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。
  2. 每个加油站的剩余量rest[i]为gas[i] - cost[i]。
  3. i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。

解释第三点:
有没有可能 [0,i] 区间 选某一个作为起点,累加到 i这里 curSum是不会小于零呢?
在这里插入图片描述
如果是区间2开始累加不小于0,但从区间1+区间2是小于0的,可以得出区间1是小于0的。
但根据我们的代码逻辑,只要小于0就会更新起始位置,那么在遍历到区间1和区间2之间的时候就已经更新起始位置了,不会一直加到当前这个位置。

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum = 0;int totalSum = 0;int start = 0;for (int i = 0; i < gas.size(); i ++) {curSum += gas[i] - cost[i]; //计算当前累加值totalSum += gas[i] - cost[i]; //计算整个数组的累加值if (curSum < 0) { //当前累加值小于0start = i + 1; //更新起始位置到i+1curSum = 0; //重新累加}}if (totalSum < 0) return -1; //说明不可能跑完一圈return start; //totalSum>=0时,将start之前的累加看作A, 之后的累加看作B, 已知A+B = total>=0,A<0,B>0,//那么B>|A|也就是B>=-A, 所以B+A>=0, 从start点出发可以跑完}
};

二、135. 分发糖果

题目链接
文章讲解
视频讲解

思路:
当有两个维度需要考虑的时候,先考虑其中一边,再考虑另一边。
本题是先考虑右孩子是否评分比较高,再考虑做孩子是否评分比较高。
1.创建一个糖果数数组,初始化为1(每个小孩至少有一个糖果);
2.从第二个元素开始从前往后遍历,判断当前元素是否比左边元素大;
3.是则当前元素需要比左边元素糖果+1;
4.从倒数第二个元素开始从后往前遍历,判断当前元素是否比右边元素大;
5.是则当前元素比右边元素糖果+1,与第一次遍历的结果做比较,取两者最大值;
6.遍历糖果数组计算糖果总数。

对于第二次遍历为什么要从后往前遍历:
因为取糖果+1的时候是取右边的糖果+1,如果是从前往后的话,右边的糖果是一直更新的,那么就导致当前正确的糖果数也一直需要更新。

代码如下:

class Solution {
public:int candy(vector<int>& ratings) {vector<int> candys(ratings.size(), 1);//从第二个元素开始从前往后遍历,判断当前元素是否比左边元素大for (int i = 1; i < ratings.size(); i ++) {if (ratings[i] > ratings[i - 1]) candys[i] = candys[i - 1] + 1;}//从倒数第二个元素开始从后往前遍历,判断当前元素是否比右边元素大for (int i = ratings.size() - 2; i >= 0; i --) {if (ratings[i] > ratings[i + 1]) {candys[i] = max(candys[i], candys[i + 1] +  1);} }int result = 0;for (int candy:candys) {result += candy;}return result;}
};

三、860. 柠檬水找零

题目链接
文章讲解
视频讲解

思路:
记录拿到的5美金,10美金的张数。分三种情况处理:
1.收到5美金,直接5美金数量+1;
2.收到10美金,10美金数量+1,5美金数量-1;
3.收到20美金,优先找一张10美金和5美金;当没有10美金时,找3张5美金。

代码如下:

    class Solution {public:bool lemonadeChange(vector<int>& bills) {int num5 = 0;int num10 = 0;for (int i = 0; i < bills.size(); i++) {if (bills[i] == 5) num5++; //5美金++else if (bills[i] == 10) { //找5美金,10美金++num5--;num10++;}else { //20美金if (num10) { //优先给一张10美金和一张5美金num10--;num5--;} else { //不够的话就用3张5美金num5 -= 3;}}if (num5 < 0) return false;  //5美金不够}return true;}};

四、406.根据身高重建队列

题目链接
文章讲解
视频讲解

思路:
跟135. 分发糖果 一样,本题也需要考虑两个情况,身高和排在前面的人数。
那么先试试,先按其中一个元素来排序。

  1. 如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。
  2. 如果按身高h来排序,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。
  3. 那么此时优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。
    在这里插入图片描述

vector版

代码如下:

class Solution {
public://people[i] = [hi, ki]//按身高从高到低排列,身高相等时,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);vector<vector<int>> result;for (int i = 0; i < people.size(); i++) {int pos = people[i][1]; //获取people[i]的k值result.insert(result.begin() + pos, people[i]); //按照k值插入到结果集中}return result;}
};

list版

因为vector是动态数组,在插入的时候会触发扩容,且数组的插入效率低。而list底层是链表,插入的效率高得多。
但是需要注意的是vector是连续内存,所以可以用vector.begin()+pos的方式直接插入。
而链表不是连续内存,所以只能通过迭代器it++的形式找到要插入的位置再调用insert插入。

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);list<vector<int>> result; //list底层是链表实现,插入效率比vector高得多for (int i = 0; i < people.size(); i++) {int pos = people[i][1];auto it = result.begin(); //list<vector<int>> iterator it = result.begin();while (pos--) { //寻找插入位置it++;}result.insert(it, people[i]);}    return vector<vector<int>>(result.begin(), result.end());}
};

总结

贪心算法第三天,当遇到需要考虑两个维度的条件时,先处理好其中一个条件,再处理另一个条件。

明天继续加油!

相关文章:

代码随想录算法训练营day29

代码随想录算法训练营 —day29 文章目录 代码随想录算法训练营前言一、134. 加油站暴力解法贪心算法 二、135. 分发糖果三、860. 柠檬水找零四、406.根据身高重建队列vector版list版 总结 前言 今天是算法营的第29天&#xff0c;希望自己能够坚持下来&#xff01; 今日任务&a…...

android studio根据包名获取当前安装包信息

package com.example.myapplication2;import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.util.Log;/**** 获取版本信息*/ public class SystemHelper {/*** 获取本地软件版本号*/public stat…...

学习第六十五行

仔细观察键盘&#xff0c;会发现一个$符号&#xff0c;其实是有含义的。 在 shell 脚本中&#xff0c;美元符号 $ 有几种重要的含义&#xff1a; 变量引用&#xff1a;$ 用于引用变量的值。例如&#xff0c;如果你有一个变量 name&#xff0c;可以通过 $name 来获取它的值。 n…...

零碎的知识点(七):线性二次调节器(LQR)是什么?

线性二次调节器&#xff08;LQR&#xff09;是什么&#xff1f; 1. LQR的定义与目标2. LQR的原理性能指标 J J J最优解的计算控制律 3. LQR的性质4. 举例说明问题描述解步骤仿真结果 5. 实际应用总结 线性二次调节器&#xff08;LQR&#xff09; 是一种经典的最优控制方法&…...

Matlab一些使用技巧

代码分段 两个百分号就可以实现代码的分段&#xff0c;不同段之间会以不同的背景色显示&#xff0c;方便调试 如下&#xff1a; %% 腐蚀 stlen TimeWidth*Fs/50; %线性算子的长度&#xff0c;1/100的脉宽&#xff0c;对应0.5us&#xff0c;15个采样点 stlen 100; SE strel…...

Linux 发行版介绍与对比:Red Hat、Ubuntu、Kylin、Debian

Linux 操作系统有众多发行版&#xff08;Distros&#xff09;&#xff0c;每个发行版的设计目标、目标用户、应用场景和使用方式有所不同。常见的 Linux 发行版包括 Red Hat、Ubuntu、Kylin 和 Debian。以下是这些发行版的详细介绍与对比&#xff0c;以及它们的应用场景和使用方…...

从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)

引言&#xff1a; 在我们之前的文章中&#xff0c;我们详细探讨了从CentOS迁移到龙蜥操作系统的基本过程和考虑因素。今天&#xff0c;我们将继续这个系列&#xff0c;重点关注龙蜥系统的实际应用——特别是常用软件的安装和配置。 龙蜥操作系统&#xff08;OpenAnolis&#…...

java1-相对路径与绝对路径

注意注意~开始新部分啦! 开始正式分享java前,先为大家分享一下一个常用的概念---文件的相对路径与绝对路径. 开篇明义: 相对路径是指一个文件或目录相对于当前工作目录的路径。相对路径不包含根目录&#xff0c;而是从当前目录开始计算。 绝对路径是指一个文件或目录从根目录…...

iChainfo 品牌升級為 ichaingo,打造 Web3 數據基礎設施新標杆

Web3 數據基礎設施服務商 iChainfo 今⽇正式宣佈&#xff0c;全新名稱 「ichaingo」 重磅登場&#xff0c;新的官⽅網站 ichaingo.com 正式上線。此次品牌升級基於 Web3 ⾏業的發展趨勢和公司⾃⾝的戰略布局&#xff0c;旨在為全 球⽤戶提供更準確、即時、全⾯、深⼊的 Web3 數…...

Flink概念知识讲解之:Restart重启策略配置

Flink概念知识讲解之&#xff1a;Restart重启策略配置 当 Task 发生故障时&#xff0c;Flink 需要重启出错的 Task 以及其他受到影响的 Task &#xff0c;以使得作业恢复到正常执行状态。 Flink 通过重启策略和故障恢复策略来控制 Task 重启&#xff1a;重启策略决定是否可以…...

[java基础-集合篇]LinkedList源码粗析

LinkedList 的数据结构 实现List、Deque 接口&#xff0c;基于 双向链表实现的列表。与基于数组的 ArrayList 不同&#xff0c;基于链表的LinkedList 允许在列表的任何位置快速地插入和删除元素。 Java中LinkedList实现了Deque&#xff0c;它提供了 add, offer, remove, poll, …...

面试:C++类成员初始化顺序

1、非静态数据成员&#xff1a;按它们在类定义的声明顺序初始化&#xff0c;不会按它们在初始化列表的顺序。 2、静态数据成员&#xff1a;在main函数启动之前&#xff0c;并且只初始化一次 3、基类构造函数&#xff1a;如果类从一个或多个基类继承而来&#xff0c;基类的构造…...

【Python】Python与C的区别

文章目录 语句结束符代码块表示变量声明函数定义注释格式Python的标识符数据输入input()函数数据输出print()函数 语句结束符 C 语言 C 语言中每条语句必须以分号;结束。例如&#xff0c;int a 10;、printf("Hello, World!");。分号是语句的一部分&#xff0c;用于…...

[开源]自动化定位建图系统(视频)

系统状态机&#xff1a; 效果展示&#xff1a; 1、 机器人建图定位系统-基础重定位&#xff0c;定位功能演示 2、 机器人建图定位系统-增量地图构建&#xff0c;手动回环检测演示 3、… 开源链接&#xff1a; https://gitee.com/li-wenhao-lwh/lifelong-backend Qt人机交互…...

ISP流程--去马赛克详解

前言 本期我们将深入讨论ISP流程中的去马赛克处理。我们熟知&#xff0c;彩色图像由一个个像元组成&#xff0c;每个像元又由红、绿、蓝&#xff08;RGB&#xff09;三通道构成。而相机传感器只能感知光的强度&#xff0c;无法直接感知光谱信息&#xff0c;即只有亮暗而没有颜色…...

Objective-C语言的软件工程

Objective-C语言的软件工程探讨 引言 在软件工程的领域中&#xff0c;编程语言的选择是至关重要的。Objective-C&#xff0c;作为一种为苹果公司的macOS和iOS操作系统而开发的编程语言&#xff0c;凭借其灵活性和强大的功能被广泛应用于应用开发。然而&#xff0c;随着Swift等…...

Objective-C语言的语法糖

Objective-C语言的语法糖探秘 在编程语言的发展历程中&#xff0c;语法糖&#xff08;Syntactic Sugar&#xff09;是一个颇具趣味性和重要性的概念。它让编程的表达更加简洁直观&#xff0c;同时提高了代码的可读性和可维护性。Objective-C 作为一种面向对象的编程语言&#…...

设计模式中的代理模式

在Java中&#xff0c;代理模式&#xff08;Proxy Pattern&#xff09;可以通过静态代理和动态代理两种主要方式实现。 一、静态代理模式 在编译时就已经确定了代理类和被代理类的关系。 代理类和目标对象通常实现相同的接口或继承相同父类。 缺点是对于每个需要代理的目标对象…...

15个学习Python 的编程游戏网站

从小很多人都会在想&#xff0c;那些枯燥的教学课程要是全部变成游戏就好了&#xff0c;这样的话那期末成绩不得立即起飞了嘛&#xff1f;那对于编程很多人也有这样的想法&#xff0c;边玩边学就好了 这不已经有很多程序员开发了多款边玩边学的编程游戏供大家使用&#xff0c;…...

微信小程序实现拖拽盒子效果

要实现一个当前盒子高度由里面的盒子进行支配高度拖拽的效果 // wxml<view class"exmation-item" wx:elif"{{type4}}"> <view class"exmation-item-drag-box" id"drag-box"> <!-- 内容 --><view class"exm…...

Linux-蓝牙协议

SPP (Serial Port Profile): 串口协议&#xff08;SPP&#xff09;是一个蓝牙配置文件&#xff0c;允许设备通过蓝牙模拟传统的串行端口通信。它通常用于无线串口连接&#xff0c;允许设备如计算机和外设&#xff08;例如打印机或条形码扫描器&#xff09;之间进行数据传输。A…...

moviepy 将mp4视频文件提取音频mp3 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…...

imageio 图片转mp4 保存mp4

目录 安装&#xff1a; imageio 图片转mp4 numpy 保存mp4 安装&#xff1a; FFMPEG: pip install imageio[ffmpeg] pyav: pip install imageio[pyav] imageio 图片转mp4 import glob import osimport cv2 import imageio from natsort import natsortedfrom PIL import …...

Postman接口测试04|批量运行测试用例、参数化、Mock Server、Cookie鉴权、Newman生成测试报告

目录 十一、Postman批量运行测试用例 十二、实现数据驱动&#xff08;也称参数化&#xff09; 1、csv文件 1️⃣编辑csv文件 2️⃣更新参数的值 3️⃣修改测试脚本和断言 5️⃣批量运行测试用例 2、Json文件 1️⃣编辑Json文件 2️⃣其他操作和处理csv文件相同 十三、…...

学技术学英语:http状态码 401 Unauthorized vs 403 Forbidden

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a;先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 unauthorized未授权的/ˌʌnˈɔːθəraɪzd/authentication认证/…...

@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时&#xff0c;会考虑组件的父子关系&#xff0c;使用了bind(this)之后&#xff0c;组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题&#xff0c;引入LocalBuilder装饰器。…...

React(二)——Admin主页/Orders页面/Category页面

文章目录 项目地址一、侧边栏1.1 具体实现 二、Header2.1 实现 三、Orders页面3.1 分页和搜索3.2 点击箭头显示商家所有订单3.3 页码按钮以及分页 四、Category页面4.1 左侧商品添加栏目4.2 右侧商品上传栏 五、Sellers页面六、Payment Request 页面&#xff08;百万数据加载&a…...

移动端屏幕分辨率rem,less

谷歌模拟器&#xff1a;能直接看到移动端效果 屏幕分辨率 右键电脑桌面 &#xff0c;点击显示设置 PC端是逻辑分辨率&#xff0c;移动端代码也是参考逻辑分辨率 网页端宽度和逻辑分辨率尺寸相同 手机屏幕尺寸不同&#xff0c;网页宽度均为 100% 所以就需要添加视口标签&#x…...

Docker Desktop 构建java8基础镜像jdk安装配置失效解决

Docker Desktop 构建java8基础镜像jdk安装配置失效解决 文章目录 1.问题2.解决方法3.总结 1.问题 之前的好几篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop环境构建java8的最小jre基础镜像&#xff0c;前几天我使用Docker Desktop环境重新构建了一个…...

数据结构:栈(Stack)和队列(Queue)—面试题(一)

目录 1、括号匹配 2、逆波兰表达式求值 3、栈的压入、弹出序列 4、最小栈 1、括号匹配 习题链接https://leetcode.cn/problems/valid-parentheses/description/ 描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] …...

傻瓜式做网站程序/百度客服人工电话24小时

异步 HTTP 客户端Tornado 包含了两种非阻塞式 HTTP 客户端实现&#xff1a;SimpleAsyncHTTPClient 和 CurlAsyncHTTPClient。前者是直接基于 IOLoop 实现的&#xff0c;因此无需外部依赖关系。 后者作为 Curl 客户端&#xff0c;需要安装 libcurl 和 pycurl 后才能正常工作&…...

欧美化妆品网站模板/大地seo视频

归并排序 将数组分为左右两部分&#xff0c;然后分别排序&#xff0c;最后再合并 public function _sort(&$arr,$left,$right){if($left<$right){//如果做小于右则&#xff0c;取出中间值&#xff0c;取整。进入递归过程。$mid floor(($left$right)/2);$this->_sort…...

菜鸟教程网站怎么做/简述在线推广网站的方法

这套题还是比较基础的。 首先b题是队友a的&#xff0c;我只是刚读懂题&#xff0c;如果没读错的话&#xff0c;应该就是匹配字符串&#xff0c;如果有一个happiness就输出yes&#xff0c;且输出匹配的位置和下一个位置就行&#xff0c;如果没有happiness就随便输出两个位置就行…...

网站建设技术jsp课程设计/线下推广方式都有哪些

辗转了几个blog&#xff0c;也用了自己域名2年&#xff0c;感觉忙起来&#xff0c;可能没有那么多时间去维护自己的域&#xff1b; 其他地方的blog也不在一块&#xff0c;思虑许久后&#xff0c;来到cnblogs&#xff1b;转载于:https://www.cnblogs.com/jking10/p/3375846.html…...

wordpress4.9升级失败/网络营销的推广

目录一&#xff0c;后端部署1&#xff0c;项目打包1.1&#xff0c;引入插件1.2&#xff0c;maven打包1.3&#xff0c;修改项目版本号1.4&#xff0c;验证1.5&#xff0c;生成配置文件2&#xff0c;服务器环境搭建2.1&#xff0c;安装JDK1&#xff09;下载2&#xff09;tar包安装…...

wordpress手机版如何设置密码/八八网

一.基本信息 1.1 基本常识 1.2 事务隔离级别 1.3 事务的传播行为 A业务方法调用B业务方法&#xff0c;如果B看A没有业务方法&#xff0c;则新建一个业务方法&#xff0c;如果B看A业务方法&#xff0c;则B就加入到A的事务方法中。 1.4 事务的状态 1.5 总结...