【代码随想录|贪心算法03】

134.加油站

题目链接: 134. 加油站 - 力扣(LeetCode)

这道题是问我从哪个点开始遍历我的加油油量减去消耗掉的油量都为正,我感觉死扣根本想不出来一点。

这里的思路是保存每个站的的加油量减去消耗量(cursum),他为正我肯定就能进行遍历,然后如果一个不小心,你油不够了(cursum<0),那这个点前面的点肯定都不够这个点消耗的了,因为题目说存在解结果是唯一的,那我只要从后面的第一个油是正数的点开始遍历就足够了(按道理我第二个油是正数的点可能也可以,但是题目说只有一个解所以取第一个)

//错误代码
class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int totalsum=0,cursum=0,start=0;for(int i=0;i<gas.size();i++){totalsum=gas[i]-cost[i];cursum=gas[i]-cost[i];if(cursum<0){start=i+1;break;//不能直接退出,后面可能还有负数点}}if(totalsum<0)return -1;return start;}
};

在做的时候,发现我这个不对,我最开始想的是我要第一个正数点那,取到了我退出了不就好了,然后报错的一组数据是

gas:[1, 2, 3, 4, 5]

cost:[3, 4, 5, 1, 2]

那么我每个站点需要消耗的量

rest:[-2,-2,-2,3,3]

这里如果cursum取到负数就退出的话我结果就会是1了,后来想想 我确实是要从负数的下一个作为起点,但是当我遇到负数的时候还要进行统计,因为有可能我负数的后面还是负数,所以不能直接退出。遇到负数的时候把cursum置零老老实实继续遍历吧~

//正确代码
class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int totalsum = 0, cursum = 0, start = 0;for (int i = 0; i < gas.size(); i++) {cursum += gas[i] - cost[i];totalsum += gas[i] - cost[i];//统计整个进油出油量,放这里偷懒少写一个循环if (cursum < 0) {start = i + 1;cursum = 0;}}if (totalsum < 0)return -1;//每个站点需要消耗的量加起来都是负数了,肯定找不到elsereturn start;}
};

135.分发糖果

题目链接135. 分发糖果 - 力扣(LeetCode)

这道题如果两边一起比较的话写代码会很混乱,这里思路是先从前往后进行遍历,右边孩子评分和左边孩子评分进行比较,给糖果,然后从后往前进行遍历,左边孩子评分和右边孩子评分进行比较,更新最大糖果值。

局部最优:满足从前往后遍历和从后往前遍历的孩子都拿到相应的糖果。

全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。

class Solution {
public:int candy(vector<int>& ratings) {int result = 0;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 + 1] + 1, candy[i]);}//左边孩子和右边孩子进行比较,所以从倒数第二个开始}for (int i = 0; i < ratings.size(); i++) {result += candy[i];//统计总共的糖果数}return result;}
};

860.柠檬水找零

题目链接:860. 柠檬水找零 - 力扣(LeetCode)

这里有三种情况

一、收到的钱是5

那就美滋滋,也不用补

二、收到的钱是10

得看看我现在还有没有5块哦,没有就只能return false了

三、收到的钱是20

优先补10块+5块的,其次再补3个5块。 因为我的5块可以补10块和20,但是10块只能补20,所以优先把10块的给用了。

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) {five--;ten++;} elsereturn false;}if (bill == 20) {if (ten > 0 && five > 0) {ten--;five--;} else if (five >= 3) {five -= 3;} elsereturn false;}}return true;}
};

406.根据身高重建队列

题目链接:406. 根据身高重建队列 - 力扣(LeetCode)

因为这道题要从两个维度来考虑,所以要分别从两边开始贪

如果先从前面有k个人的k开始贪的话身高确定不下来,k也确定不下来,因为前面按照k从小到大排列 k根本就不能代表前面有多少人,比如说[1,0][1,0][1,0][1,1],你的k等于1,但是前面有3个人

所以要从身高(h)开始排

排之前:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]

排之后:people=[[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]

身高(h)确定下来之后再确定k(前面有k个人),就挨着一个个进行比较,身高低前面排的人少的就给他插到前面去,因为这样也不会影响后面的结点

过程:

  • 插入[7,0]:[[7,0]]
  • 插入[7,1]:[[7,0],[7,1]]
  • 插入[6,1]:[[7,0],[6,1],[7,1]]
  • 插入[5,0]:[[5,0],[7,0],[6,1],[7,1]]
  • 插入[5,2]:[[5,0],[7,0],[5,2],[6,1],[7,1]]
  • 插入[4,4]:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
class Solution {
public:static bool cmp(vector<int>& a, vector<int>& b) {if (a[0] == b[0])return a[1] < b[1];return a[0] > b[0];//身高从大到小排,身高相同k大的排后面}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;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-table 最简单的方法配置图片预览功能

el-table 最简单的方法配置图片预览功能 效果预览 1、安装插件 npm install v-viewernext viewerjs2、全局引入&#xff0c;配置main.js // main.js import VueViewer from v-viewer; import viewerjs/dist/viewer.css; app.use(VueViewer, {url: data-src, // 指定 data-* …

深度学习框架PyTorch中的Tensor详解

目录 ​编辑 引言 PyTorch Tensor基础 什么是Tensor&#xff1f; Tensor与NumPy ndarray Tensor的特性 多维数组 数据类型 设备兼容性 自动求导 广播机制 视图和副本 使用Tensor 创建Tensor 操作Tensor 移动Tensor 自动求导 结论 引言 在深度学习的浪潮中&a…

【实战】Oracle基础之控制文件内容的5种查询方法

关于Jady&#xff1a; ★工作经验&#xff1a;近20年IT技术服务经验&#xff0c;熟悉业务又深耕技术&#xff0c;为业务加持左能进行IT技术规划&#xff0c;右能处理综合性故障与疑难杂症&#xff1b; ★成长历程&#xff1a;网络运维、主机/存储运维、程序/数据库开发、大数…

【Docker】Docker配置远程访问

配置Docker的远程访问&#xff0c;你需要按照以下步骤进行操作&#xff1a; 1. 在Docker宿主机上配置Docker守护进程监听TCP端口 Docker守护进程默认只监听UNIX套接字&#xff0c;要实现远程访问&#xff0c;需要修改配置以监听TCP端口。 ‌方法一&#xff1a;修改Docker服务…

利用Ubuntu批量下载modis图像(New)

由于最近modis原来批量下载的代码不再直接给出&#xff0c;因此&#xff0c;再次梳理如何利用Ubuntu下载modis数据。 之前的下载代码为十分长&#xff0c;现在只给出一部分&#xff0c;需要自己再补充另一部分。之前的为&#xff1a; 感谢郭师兄的指导&#xff08;https://blo…

视频流媒体服务解决方案之Liveweb视频汇聚平台

一&#xff0c;Liveweb视频汇聚平台简介: LiveWeb是深圳市好游科技有限公司开发的一套综合视频汇聚管理平台&#xff0c;可提供多协议&#xff08;RTSP/RTMP/GB28181/海康Ehome/大华&#xff0c;海康SDK等&#xff09;的视频设备接入&#xff0c;支持GB/T28181上下级联&#xf…

飞凌嵌入式受邀亮相OpenHarmony人才生态大会2024

2024年11月27日&#xff0c;OpenHarmony人才生态大会2024在武汉洲际酒店举行。在这场汇聚了行业精英、技术大咖及生态伙伴的年度盛会上&#xff0c;飞凌嵌入式作为OpenHarmony社区的重要成员受邀出席&#xff0c;并展示了其在OpenHarmony 4.1系统适配方面的最新成果。 在大会的…

【智商检测——DP】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M 110; int f[N][M]; int main() {int n, k;cin >> n >> k;for(int i 1; i < n; i){int x;cin >> x;f[i][0] __gcd(f[i-1][0], x);for(int j 1; j < min(i, k)…

打造双层环形图:基础与高级渐变效果的应用

在数据可视化领域&#xff0c;环形图因其独特的展示方式而广受欢迎。今天&#xff0c;我们将通过ECharts库来创建一个具有双层渐变效果的高级环形图。本文将详细介绍如何实现这种视觉效果。 1. 环形图基础 首先&#xff0c;我们需要了解环形图的基本构成。环形图由内外两个圆…

开源的跨平台SQL 编辑器Beekeeper Studio

一款开源的跨平台 SQL 编辑器&#xff0c;提供 SQL 语法高亮、自动补全、数据表内容筛选与过滤、连接 Web 数据库、存储历史查询记录等功能。该编辑器支持 SQLite、MySQL、MariaDB、Postgres 等主流数据库&#xff0c;并兼容 Windows、macOS、Linux 等桌面操作系统。 项目地址…

MacOS 配置github密钥

MacOS 配置github密钥 1. 生成GitHub的SSH密钥对 ssh-keygen -t ed25519 -C "xxxxxxx.com" -f ~/.ssh/id_ed25519_github 其中 xxxxxxxxxxx.com 是注册github、gitee和gitlab的绑定账号的邮箱 -t ed25519:生成密钥的算法为ed25519&#xff08;ed25519比rsa速度快&…

网际协议(IP)与其三大配套协议(ARP、ICMP、IGMP)

网际协议&#xff08;Internet Protocol&#xff0c;IP&#xff09;&#xff0c;又称互联网协议。是OSI中的网络层通信协议&#xff0c;用于跨网络边界分组交换。它的路由功能实现了互联互通&#xff0c;并从本质上建立了互联网。网际协议IP是 TCP/IP 体系中两个最主要的协议之…

永磁同步电机谐波抑制算法(11)——基于矢量比例积分调节器(vector PI controller,VPI controller)的谐波抑制策略

1.前言 相比于传统的谐振调节器&#xff0c;矢量比例积分调节器&#xff08;vector PI controller&#xff0c;VPI controller&#xff09;多一个可调零点&#xff0c;能够实现电机模型的零极点对消。因此VPI调节器也被广泛应用于交流控制/谐波抑制中。 2.参考文献 [1] A. G…

Windows下从命令行(Powershell/CMD)发送内容到系统通知中心

Windows下从命令行&#xff08;Powershell/CMD&#xff09;发送内容到系统通知中心 01 前言 在平时写脚本的时候&#xff0c;将日志等信息直接输出到控制台固然是最直接的&#xff0c;而如果是一些后台执行的任务&#xff0c;不需要时刻关注运行细节但是又想知道一些大致的情…

排序(数据结构)

排序&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 常见排序法 . 常见排序算法的实现 插入排序 1.直接插入排序 2.希尔排序( 缩小增量排序&#xff09; 希尔排序的特性总结&#x…

Android:生成Excel表格并保存到本地

提醒 本文实例是使用Kotlin进行开发演示的。 一、技术方案 org.apache.poi:poiorg.apache.poi:poi-ooxml 二、添加依赖 [versions]poi "5.2.3" log4j "2.24.2"[libraries]#https://mvnrepository.com/artifact/org.apache.poi/poi apache-poi { module…

基数排序(代码+注释)

#include <stdio.h> #include <stdlib.h>// 获取数组中的最大值 int GetMax(int* a, int n) {int max a[0];for (int i 1; i < n; i) {if (a[i] > max) {max a[i];}}return max; }// 对数组按照某个位数进行计数排序 void CountingSortForRadix(int* a, i…

Web基础

实践目标 &#xff08;1&#xff09;Web前端HTML&#xff08;2&#xff09;Web前端javascipt&#xff08;3&#xff09;Web后端&#xff1a;MySQL基础&#xff1a;正常安装、启动MySQL&#xff0c;建库、创建用户、修改密码、建表&#xff08;4&#xff09;Web后端&#xff1a…

Python酷库之旅-第三方库Pandas(251)

目录 一、用法精讲 1186、pandas.tseries.offsets.BusinessMonthEnd.is_year_start方法 1186-1、语法 1186-2、参数 1186-3、功能 1186-4、返回值 1186-5、说明 1186-6、用法 1186-6-1、数据准备 1186-6-2、代码示例 1186-6-3、结果输出 1187、pandas.tseries.offs…

1.1 STM32_GPIO_基本知识

GPIO概述 GPIO全称为通用输入输出端口&#xff0c;可以对外设的信息进行采集以及对外设进行控制。 GPIO最大翻转频率计算 GPIO可以进行快速翻转&#xff0c;每次翻转最快只需两个时钟周期。例如STM32的晶振为72MHz&#xff0c;那么GPIO的最快翻转速度为72/2 36MHz。对于F1&…