【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。

day 35,连休两天~

题目详情

[134] 加油站

题目描述

134 加油站
134 加油站

解题思路

前提:数组
思路:全局贪心算法:最小累加剩余汽油为负数,说明从非0开始,起始点至n-1点汽油剩余累加需要填平最小累加剩余汽油数;局部贪心算法:累加剩余和小于0,从i+1点开始。
重点:整体贪心算法 or 局部贪心算法。

代码实现

C语言
整体贪心算法

整体贪心算法有以下几种情况:
情况一:如果gas的总和小于cost总和,那么无论从哪里出发,一定是跑不了一圈的
情况二:rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。
情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。

int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {int rest[gasSize];int minRest = 10001;int curSum = 0;for (int i = 0; i < gasSize; i++) {rest[i] = gas[i] - cost[i];curSum += rest[i];if (curSum < minRest) {minRest = curSum;}}// 如果累加剩余汽油为负数,说明总加油量 < 总消耗量,不足以跑一圈if (curSum < 0) {return -1;}// 如果最小累加剩余汽油为非负数,说明可以从0开始绕一圈if (minRest >= 0) {return 0;}// 最小累加剩余汽油为负数,说明从非0开始,起始点至n-1点汽油剩余累加需要填平最小累加剩余汽油数// 从后向前遍历for (int j = gasSize - 1; j >= 0; j--) {minRest += rest[j];if (minRest >= 0) {return j;}}return -1;
}
局部贪心算法

局部贪心算法:
局部最优:i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。
全局最优:找到可以跑一圈的起始位置。

int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {int start = 0;int curSum = 0;int totalSum = 0;for (int i = 0; i < gasSize; i++) {curSum += gas[i] - cost[i];totalSum += gas[i] - cost[i];// 如果累加和小于0,说明不能从[0, i]中任一点出发if (curSum < 0) {curSum = 0;start = i + 1;}}// 总剩余和小于0,说明无法跑一圈if (totalSum < 0) {return -1;}return start;
}

[135] 分发糖果

题目描述

135 分发糖果
135 分发糖果

解题思路

前提:相邻两个孩子评分更高的孩子,需要连续比较左中右3个孩子
思路:先比较右边评分大于左边情况:从前向后遍历数组;局部最优:只要右边评分比左边大,右边的孩子就多一个糖果;全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果。再比较左边大于右边情况:从后向前遍历数组。
重点:确定一边之后,再确定另一边。

代码实现

C语言
贪心算法

先遍历比较右>左【从前向后】情况,后遍历左>右【从后向前】情况

int candy(int* ratings, int ratingsSize) {int candy[ratingsSize];long long candySum = 0;// 初始化for (int i = 0; i < ratingsSize; i++) {candy[i] = 1;}// 从前往后,遍历右孩子评分 > 左孩子评分的情况for (int i = 1; i < ratingsSize; i++) {if (ratings[i] > ratings[i - 1]) {// 相邻两个孩子评分更高的孩子会获得更多的糖果if (candy[i] <= candy[i - 1]) {candy[i] = candy[i - 1] + 1;}}}// 从前往后,遍历左孩子评分 > 右孩子评分的情况for (int i = ratingsSize - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1]) {// 相邻两个孩子评分更高的孩子会获得更多的糖果if (candy[i] <= candy[i + 1]) {candy[i] = candy[i + 1] + 1;}}}// 求糖果数量for (int i = 0; i < ratingsSize; i++) {candySum += candy[i];}return candySum;
}

[860] 柠檬水找零

题目描述

860 柠檬水找零
860 柠檬水找零

解题思路

前提:
思路:维护5,10,20三种金额的数量。
重点:贪心思维,优先消耗10的数量。

代码实现

C语言
贪心思维
bool lemonadeChange(int* bills, int billsSize) {int coin5 = 0;int coin10 = 0;int coin20 = 0;for (int i = 0; i < billsSize; i++) {if (bills[i] == 5) {coin5++;}if (bills[i] == 10) {if (coin5 < 1) {return false;}coin5--;coin10++;}if (bills[i] == 20) {if (coin10 > 0) {if (coin5 < 1) {return false;}coin10--;coin5--;} else {if (coin5 < 3) {return false;}coin5 -= 3;}}}return true;
}

[406] 根据身高重建队列

题目描述

406 根据身高重建队列
406 根据身高重建队列

解题思路

前提:两个维度:身高h, 数量k。
思路:贪心思维:按照身高从高到低,k值从小到大排序后,按照k的值,插入数组中的位置。
重点:确定一边然后贪心另一边,两边一起考虑,就会顾此失彼。。

代码实现

C语言
贪心思维

身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。
按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。。
局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性
全局最优:最后都做完插入操作,整个队列满足题目队列属性

/*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/int cmp(const void *p1, const void *p2)
{int *pp1 = *(int **)p1;int *pp2 = *(int **)p2;// 按照身高从高到低,k值从小到大排序return pp1[0] == pp2[0] ? pp1[1] - pp2[1] : pp2[0] - pp1[0];
}void moveNum(int **people, int idx)
{int loc = people[idx][1];int *tmp = people[idx];// 移动loc后元素,即移动for (int j = idx - 1; j >= loc; j--) {people[j + 1] = people[j];}people[loc] = tmp;return;
}int** reconstructQueue(int** people, int peopleSize, int* peopleColSize, int* returnSize, int** returnColumnSizes) {// 按照身高从高到低,k值从小到大排序qsort(people, peopleSize, sizeof(int *), cmp);// 按照k的值,插入数组中的位置int start = 0;int end = 0;for (int i = 0; i < peopleSize; i++) {moveNum(people, i);}// 输出*returnSize = peopleSize;*returnColumnSizes = (int *)malloc(sizeof(int) * peopleSize);for (int k = 0; k < peopleSize; k++) {(*returnColumnSizes)[k] = 2;}return people;
}

今日收获

  1. 贪心算法:艰难的应用。

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

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

相关文章

师彼长技以助己(6)递归思维

师彼长技以助己&#xff08;6&#xff09;递归思维 递归思维-小游戏 思维小游戏 思维 小游戏&#xff1a;1 玩一个从1或2开始往上加的游戏&#xff0c;谁加到20就赢 如何保证一定赢呢&#xff1f;我们倒推&#xff0c;要先到20的话&#xff0c;谁先到17就赢&#xff0c;如此…

深入理解 Java 中的 synchronized 代码块

目录 前言 一、synchronized的工作原理 二、使用synchronized代码块的场景 三、编写synchronized代码块的最佳实践 四、何时使用 synchronized 代码块&#xff1f; 同步&#xff1a; 不同步&#xff1a; 五、Demo讲解 1.使用synchronized代码块减小锁的粒度&#xff0c…

勒索病毒剖析

2016年不自己勒索了 卖病毒 让别人勒索 傻瓜式勒索 黑客用的是非对称加密 全世界只有黑客有那把私钥 反向解密不了 传统爆破容易被检测&#xff0c;黑客慢速爆破&#xff0c;利用超级多的僵尸进行试错&#xff0c;慢慢试出来账号密码 因为一般运维设备在防火墙的白名单里&…

增值税发票OCR识别API在Java、Python、PHP中的使用教程

​增值税发票OCR识别是一种利用光学字符识别&#xff08;OCR&#xff09;技术&#xff0c;自动提取和识别增值税发票上的文字信息的过程。增值税发票是企业在销售商品或提供服务过程中产生的一种税务凭证&#xff0c;包含了关键的财务信息&#xff0c;如商品明细、金额、税率等…

【Spine学习09】之导入皮肤两种方式[skin]

第一种&#xff1a;明确项目中某个角色是有两套皮肤的情况下 直接导入两套皮肤 1、添加SKIN皮肤指令 2、在ps中-文件-脚本-浏览【打开选中jsx脚本】 3、打开Spine 点击左上角&#xff0c;选择导入数据 就可以看到该角色的两套皮肤啦&#xff01; 第二种&#xff1a;刚开始角…

[DDR4] 总目录 学习路线

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 传送门: 总目录 目录 基础篇 1-1 DDR4 发展历史 1-2 DDR4 和 DDR3 差异与优势 1-3 DDR4 内部结构 1-4 DDR4 工作原理 协议篇 2-1 DDR4 引脚 设计篇 实践篇 进阶篇 学习路线&#xff1a; 了解DDR4的基本知识…

openh264 SVC 时域分层原理介绍

openh264 OpenH264是一个开源的H.264编码器&#xff0c;由Cisco公司开发并贡献给开源社区。它支持包括SVC&#xff08;Scalable Video Coding&#xff09;在内的多种编码特性&#xff0c;适用于实时应用场景&#xff0c;比如WebRTC。OpenH264项目在GitHub上是公开的&#xff0…

Docker部署常见应用之SFTP服务器

文章目录 简介Dockers部署单用户多用户用户信息加密使用SSH密钥认证 参考文章 简介 atmoz/sftp 是一个基于 Docker 的 SFTP 服务镜像&#xff0c;它使用 OpenSSH 来提供 SFTP 服务。这个镜像支持创建单个或多个用户的 SFTP 访问&#xff0c;并允许用户通过 SFTP 协议安全地共享…

Excel 多列组合内容循环展开

某表格 A 列是编号&#xff0c;其他列是用逗号分隔的意义不同的分类列 ABCDEFG1Assembly#ProductTypeUnit ConfigNominal CapacitySupply VoltageGenerationCase Construction23H1012290001CMD,P24,36FAA,B33H1012290002CMD,P48,60FA,BA,B43H1012290003CMD,P24,36B,C,D,EAA,B …

SSM母婴用品交流系统-计算机毕业设计源码05772

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 母婴用品交流系统&#xff0c;主要的模块包括查看首页、轮播图管理、通知公告管理、资源管理&#xff08;母婴资讯、资讯分类&#xff09;、交…

统计信号处理基础 习题解答10-17

题目&#xff1a; 在选择不含信息的或者不假设任何先验知识的先验PDF时,我们需要从数据中得到最大的信息量。在这种方式下,数据是了解未知参数的主要贡献者。利用习题10.15的结果,这种方法可以通过选择使I最大的来实现。对于例10.1的高斯先验PDF,该如何选择和2使得 是不含信息…

visual studio 2022使用全版本平台工具集

https://www.cnblogs.com/coolfan/p/15822057.html vs2022使用全版本平台工具集 关键词&#xff1a;visual studio 2022使用全版本平台工具集;vs2022使用vc60、vc6.0工具集;vs2022使用全部旧平台工具集 优点&#xff1a;用v60平台工具集编译出来的exe文件可以无依赖的运行在W…

流量卡怎么办理的攻略

一、确定需求 在办理流量卡之前&#xff0c;你需要明确自己的需求。根据不同的使用场景&#xff0c;你可能需要考虑以下几个方面&#xff1a; 月租费用&#xff1a;不同运营商提供的流量卡套餐价格各异&#xff0c;从低至19元到高达199元不等。 流量大小&#xff1a;从30GB到3…

【设计模式深度剖析】【8】【行为型】【备忘录模式】| 以后悔药为例加深理解

&#x1f448;️上一篇:观察者模式 设计模式-专栏&#x1f448;️ 文章目录 备忘录模式定义英文原话直译如何理解呢&#xff1f; 3个角色1. Memento&#xff08;备忘录&#xff09;2. Originator&#xff08;原发器&#xff09;3. Caretaker&#xff08;负责人&#xff09;类…

使用 Python 进行测试(1)测试基础

原文 总结 我们将从unittest开始&#xff0c;尽管它并不那么好用&#xff0c;但它是Python标准库中的测试工具。 使用unittest编写测试看起来像这样&#xff1a; import unittest# 需要测试的代码 def add(a, b):return a b# The tests class TestAddFunction(unittest.Test…

拦截器 之 用户登录判断

spring boot 拦截器的实现需要有两步&#xff1a; 自定义一个拦截器 package com.example.demo.common;import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import org.springfra…

Golang——gRPC gateway网关

前言 etcd3 API全面升级为gRPC后&#xff0c;同时要提供REST API服务&#xff0c;维护两个版本的服务显然不大合理&#xff0c;所以gRPC-gateway诞生了。通过protobuf的自定义option实现了一个网关。服务端同时开启gRPC和HTTP服务&#xff0c;HTTP服务接收客户端请求后转换为gr…

SAP HANA1709~2023版本Fiori激活简介

SAP Fiori 是一个设计系统,使您能够创建具有消费者级别用户体验的业务应用,通过在任何设备上运行,可以在Ipad或者是手机端都可以随时随地的使用SAP,现在越来越多的公司都在使用Fiori系统,公司高层可以更直观的在移动端设备中查看各种数据。 本文主要说明HANA版本怎么激活F…

直流放大器

一&#xff0c;概念及存在问题 集成电路主要由半导体材料构成&#xff0c;其内部适合用二极管&#xff0c;三极管等类型的元器件制作&#xff0c;而不适用电容&#xff0c;电感和变压器&#xff0c;因此集成放大电路内部多个放大电路之间通常采用直接耦合。直接耦合电路除了可…

牛客热题:兑换零钱(一)

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;兑换零钱(一)题目链接方法一&am…