代码随想录算法训练营day29 | 134. 加油站 、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列

碎碎念:加油
参考:代码随想录

134. 加油站

题目链接

134. 加油站

思想

在这里插入图片描述
局部最优: 一旦currentSum为负数,起始位置至少要是i+1。
全局最优: 最后可以跑完一圈。
局部最优可以推出全局最优且找不到反例,所以用贪心试一下。
我们关心的是经过补充和消耗油量,净增还是净减了油量。
用一个遍历currentSum来累加每个站剩余的油量,一旦currentSum变为负数,说明这个站点之前的每个站点作为起始位置都不行,所以此时要往后遍历,继续用currentSum来统计剩余油量。

题解

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int currentSum = 0;int totalSum = 0;int start = 0;for (int i = 0; i < gas.size(); i++) {currentSum += gas[i] - cost[i];totalSum += gas[i] - cost[i];if (currentSum < 0) {start = i + 1;currentSum = 0;}}if (totalSum < 0) return -1;return start;}
class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:currentSum = 0totoalSum = 0start = 0for i in range(len(gas)):currentSum += gas[i] - cost[i]totoalSum += gas[i] - cost[i]if currentSum < 0:start = i + 1currentSum = 0if totoalSum < 0:return -1return start

反思

135. 分发糖果

题目链接

135. 分发糖果

思想

确定分发糖果数的时候既要考虑当前孩子左边的情况,还要考虑右边的情况,这就要求我们分开考虑。先确定一边的情况,再去确定另一边。
在这里插入图片描述
局部最优:

  1. 右边小孩比左边小孩得分高的情况
  2. 左边小孩比右边小孩得分高的情况【需要从后往前遍历】

这样从局部最优就能推出全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。
最后把遍历把candy累加起来。

题解

// cpp
class Solution {
public:int candy(vector<int>& ratings) {vector<int> candy(ratings.size(), 1);// 从前往后,右边小孩比左边小孩得分高的情况for (int i = 1; i < ratings.size(); i++) {if (ratings[i] > ratings[i - 1]) candy[i] = candy[i - 1] + 1;}// 从后往前,左边小孩比右边小孩得分高的情况for (int i = ratings.size() - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1]) candy[i] = max(candy[i], candy[i + 1] + 1);}int result = 0;for (int i = 0; i < candy.size(); i++) result += candy[i];return result;} 
};
# python
class Solution:def candy(self, ratings: List[int]) -> int:candy = [1] * len(ratings)for i in range(1, len(ratings)):if ratings[i] > ratings[i - 1]:candy[i] = candy[i - 1] + 1for i in range(len(ratings) - 2, -1, -1):if ratings[i] > ratings[i + 1]:candy[i] =  max(candy[i], candy[i + 1] + 1)result = 0for i in range(len(candy)):result += candy[i]return result

反思

注意要两个方面分别考虑,注意for循环的范围。

860.柠檬水找零

题目链接

860.柠檬水找零

思想

局部最优: 收到20的时候优先用10+5来找零(把更万能的5留下)
全局最优: 正确找零
局部最优可以推出全局最优且找不到反例,试试贪心。
收钱遇到的几种情况:

  1. 5 直接收了
  2. 10 用5找零
  3. 20 用10+5或5+5+5找零,优先使用10+5找零。

定义三个变量,five,ten,twenty来记录收到的钞票数量。
其实20的数量可以不记录,因为找零用不到。

题解

// cpp
class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five = 0, ten = 0;for (int bill : bills) {if (bill == 5) five++;if (bill == 10) {if (five == 0) return false;ten++;five--;}if (bill ==20) {if (ten >0 && five > 0){ten--;five--;} else if (five >= 3) {five -= 3;} else return false;}}return true;}
};
# python
class Solution:def lemonadeChange(self, bills: List[int]) -> bool:five = 0ten = 0for bill in bills:if bill == 5:five += 1if bill == 10:if five > 0:five -= 1ten += 1else:return Falseif bill == 20:if five > 0 and ten > 0:five -= 1ten -= 1elif five >= 3:five -= 3else:return Falsereturn True

406.根据身高重建队列

题目链接

406.根据身高重建队列

思想

本题的思想有点像上面做的分发糖果问题,都需要两头考虑,如果同时考虑很容易出错。
局部最优: 优先按身高高的people的k来插入。插入操作过后的people满足队列属性。
全局最优: 最后都做完插入操作,整个队列满足题目队列属性。
局部最优可以推出全局最优且找不到反例,试试贪心。
需要两个维度分开考虑。

  1. 按照h从小到大排列,如果h相等,按照k从小到大排列
  2. 根据k的大小来调整排序,根据k来插入对应位置
    在这里插入图片描述

题解

// cpp
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;}
};
# python
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

反思

注意需要重新定义一个队列,因为本题需要遍历队列,同时插入会修改元素的位置,如果不重新定义一个的话,遍历的时候会乱掉。

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

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

相关文章

CST软件进行时域自适应网格设置步骤

这一期&#xff0c;我们回答一个大家非常关注的网格的问题。仿真软件的网格质量直接决定仿真的精度和效率&#xff0c;设置合理的网格才能将仿真做的又快有准。CST的微波工作室有多种求解器&#xff0c;如果用频域求解器&#xff08;F&#xff09;来仿真&#xff0c;有限元算法…

TCP的可靠机制

TCP的可靠机制 前言 要了解TCP的可靠机制&#xff0c;我们必须要先熟悉TCP的报文&#xff0c;在这篇文章中有详细介绍TCP的报文 &#xff1a; 并且确认应答机制也在该文章中提到&#xff0c;所以这篇文章就不会再介绍确认应答了。 超时重传 我们都知道&#xff0c;报文在网…

详解Qt 之QMdiArea 和 QMdiSubWindow

文章目录 前言QMdiArea概念作用为什么需要 QMdiAreaQMdiArea 的主要函数和成员函数列表 QMdiSubWindow概念作用为什么需要 QMdiSubWindowQMdiSubWindow 的主要函数和成员函数列表 示例代码 更多用法... 总结 前言 在复杂的应用程序中&#xff0c;尤其是那些需要同时管理多个子…

RabbitMQ快速入门(MQ的概念、安装RabbitMQ、在 SpringBoot 项目中集成 RabbitMQ )

文章目录 1. 补充知识&#xff1a;同步通讯和异步通讯1.1 同步通讯1.2 异步通讯 2. 同步调用的缺点2.1 业务耦合2.2 性能较差2.3 级联失败 3. 什么情况下使用同步调用4. 异步调用5. 异步调用的优点和缺点5.1 异步调用的优点5.1.1 解除耦合&#xff0c;拓展性强5.1.2 无需等待&a…

SQL必知必会

SQL必知必会 一些SQL知识&#xff0c;出自极客时间陈旸老师《SQL必知必会》 https://time.geekbang.org/column/intro/100029501 基础 视图 视图作为一张虚拟表&#xff0c;帮我们封装了底层与数据表的接口。它相当于是一张表或多张表的数据结果集。视图的这一特点&#x…

DMB,DSB,ISB三个指令区别

此部分说明三个指令的具体区别&#xff08;在指令流水线上说明&#xff09;&#xff0c;这三个指令主要目的在于确保程序在多处理器环境下的稳定性和一致性&#xff0c;避免由于指令乱序和内存操作重排引起的不可预测行为 一个简化的流水线&#xff0c;包含以下阶段&#xff1…

【git】git常用命令提交规范

Git 是程序员工作中不可或缺的版本控制工具&#xff0c;以下是一些优化后的常用 Git 命令列表&#xff0c;旨在帮助你更高效地使用 Git 进行版本控制。 基础操作 拉取代码 git clone xxx.git创建分支 git branch dev切换分支 git checkout dev # 或者 git switch dev创建并切换…

Mirror学习笔记(一) 简介

文章目录 一、常规学习&#xff1a;Mirror核心功能有服务器和主机 二、时间戳批处理时间戳 三、TCP和UDP四、CCU(同时在线人数)五、SyncDirection(同步方向)六、RTT&#xff08;往返时间&#xff09;七、Connection Quality&#xff08;连接质量&#xff09;八、Lag Compensati…

Android mLruProcesses的分布结构

AMS中的进程管理 final ArrayList<ProcessRecord> mLruProcesses new ArrayList<ProcessRecord>(); 在AMS的内部属性中使用mLruProcesses集合保存所有的进程信息&#xff0c;AMS将所有进程按照优先级从低到高的顺序保存着对应的ProcessRecord信息&#xff0c;即排…

25、Python之面向对象:私有属性是掩耳盗铃还是恰到好处

引言 声明&#xff0c;今天的文章中没有一行Python代码&#xff0c;更多的是对编程语言设计理念的思考。 上一篇文章中介绍了关于Python面向对象封装特性的私有属性的相关内容&#xff0c;提到了Python中关于私有属性的实现是通过“名称混淆”的方式来实现的&#xff0c;我们…

【Python体验】第五天:目录搜索、数据爬虫(评论区里写作业)

文章目录 目录搜索 os、shutil库数据爬虫 request、re作业&#xff1a;爬取案例的top250电影的关键信息&#xff08;名称、类型、日期&#xff09;&#xff0c;并保存在表格中 目录搜索 os、shutil库 os 模块提供了非常丰富的方法用来处理文件和目录。 os.listdir(path)&#x…

连环画:80、90后的童年记忆与副业项目的AI新玩法

在那个纯真的年代&#xff0c;当80、90后的孩子们还在为学业忙碌之余&#xff0c;一种名为连环画的读物成为了他们心中难以磨灭的记忆。 这些由一幅幅精美插图串联起来的故事&#xff0c;不仅满足了他们对知识的渴望&#xff0c;更在无形中丰富了他们的想象力和审美能力。在那…

智云-一个抓取web流量的轻量级蜜罐

智云-一个抓取web流量的轻量级蜜罐 安装环境要求 apache php7.4 mysql8 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN 系统演示

Xilinx FPGA:vivado SPI实现FLASH通信

一、实验要求 要求使用SPI协议实现对flash芯片的页编程、读操作、页擦除等功能。 二、模块划分 大概的时序图&#xff1a; 三、程序设计 &#xff08;1&#xff09;接收端模块 timescale 1ns / 1ps module uart_rx(input sys_clk ,input …

ShardingSphere实战(2)- 水平分表

项目环境&#xff1a; JDK11 MySQL 8.0.30 Springboot 2.7.4 Mybatis ShardingSphere HikariCP 连接池 一、Maven 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><versi…

C++ | string

前言 本篇博客讲解c中的string类的使用(常用接口) &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee:普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389…

Redis持久化之RDB和AOF详解

持久化是确保 Redis 数据在服务器重启或崩溃时不丢失的关键功能。由于 Redis 是基于内存的数据库&#xff0c;如果不进行持久化&#xff0c;所有数据都存在于内存中&#xff0c;一旦服务器进程退出&#xff0c;内存中的数据就会丢失。持久化机制可以将 Redis 的数据库状态保存到…

C# Unity 面向对象补全计划 之 访问修饰符

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝

vue3项目结构梳理:

总览 1.vscode文件&#xff1a; 通常用于存放Visual Studio Code编辑器的插件的配置 2.node_moudles文件夹&#xff1a; 这个文件夹包含了项目所需的所有npm依赖包。&#xff08;需要在根目录下执行npm i命令安装这个文件夹&#xff09; 或者在项目根目录&#xff08;packa…

postgresql密码复杂度验证和有效期

前言 为了数据库安全以及应对等保测评等要求&#xff0c;我们需要设置密码复杂度。我们通过passwordcheck模块实现复杂度检测功能。 启用密码复杂度验证 找到自己安装pg库的配置文件目录&#xff0c;修改postgresql.conf vim postgresql.conf修改如下内容 shared_preload_…