【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列
前言
思路及算法思维,指路 代码随想录。
题目来自 LeetCode。
day 35,连休两天~
题目详情
[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 分发糖果

解题思路
前提:相邻两个孩子评分更高的孩子,需要连续比较左中右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 柠檬水找零

解题思路
前提:
思路:维护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 根据身高重建队列

解题思路
前提:两个维度:身高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;
}
今日收获
- 贪心算法:艰难的应用。
相关文章:
【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列
前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 35,连休两天~ 题目详情 [134] 加油站 题目描述 134 加油站 解题思路 前提:数组 思路:全局贪心算法:最小累加剩余汽油为负数,说明…...
Talk|新加坡国立大学贾鑫宇:适用于高自由度机器人的运动控制器
本期为TechBeat人工智能社区第600期线上Talk。 北京时间6月13日(周四)20:00,新加坡国立大学博士生—贾鑫宇的Talk已经准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “适用于高自由度机器人的运动控制器”,向大家系统地介绍了如何通…...
【npm】console工具(含胶囊,表格,gif图片)
这是一款控制台花样输出工具 相对丰富的输出方式 文本输出属性值输出胶囊样式输出表格输出图片输出(含动图) 安装 npm install v_aot引用 import v_aot from "v_aot";字段说明 字段类型属性字符串值字符串类型default 、 primary 、 suc…...
OpenCV读取图片
import cv2 as cv # 读取图像 image cv.imread(F:\\mytupian\\xihuduanqiao.jpg) # 创建窗口 cv.namedWindow(image, cv.WINDOW_NORMAL) #显示图像后,允许用户随意调整窗口大小 # 显示图像 cv.imshow(image, image) cv.waitKey(0)import cv2 as cv srccv.imread(…...
HBase中的CRUD
Table接口:负责表数据的基本操作。 Admin类:负责管理建表、删表、该表等元数据操作的接口。 1、Put方法 1.1、了解put方法之前,必须知道的相关知识。 在HBase中有一个理念:所有的数据皆为bytes。因此在HBase中所有的数据最终都…...
C/C++学习笔记 C语言中的\0以及查找字符串中字符出现的频率
在此示例中,计算了字符串对象中字符的频率。 为此,使用size()函数查找字符串对象的长度。然后for 循环迭代直到字符串末尾。 在每次迭代中,检查字符是否出现,如果发现,则计数增加 1。 示例 1 #include <iostream&g…...
在C#中,有多种方式可以实现每天在指定的时间清空数据库数据。下面列出几种常用的方法,并提供简要的实现思路:
在C#中,实现每天在指定时间清空数据库数据的需求,可以通过多种方式来完成。下面列举了几种常用的方法: 方式一:使用 Task 和 Timer 这种方法利用 System.Threading.Timer 类来定时执行清空数据库的操作。 using System; using …...
深入理解java设计模式之单例模式
目录 概述单例模式是什么单例模式的使用场景单例模式的优缺点单例模式的几种实现方式饿汉式懒汉式双重检查锁定机制静态内部类枚举使用容器几种可能破坏单例类的方法多线程环境下的竞争条件使用反射机制使用序列化多个类加载器概述 单例模式是什么 定义:单例模式确保一个类在…...
程序员自由创业周记#36:Gap Year
程序员自由创业周记#36:Gap Year 一整年 刚过去的一周,度过了我31周岁的生日,距离结束上一份工作,刚好一年。一年过得好快,犹记得刚失业那会的迷茫,第一个月的纠结,是继续打工还是自己当“老板…...
Java 类与对象 -- Java 语言的类与对象、构造器、static、final、包和 JAR
大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 006 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…...
MTK平台纯色背景抑制
MTK中有两个机制可以抑制纯色背景的亮度,分别是Main target、Histogram。 Main target的纯色背景亮度机制原理大概如下: 将图像分成64*48块,分别统计每一块的亮度Y。 但对于纯色背景时,如果仍然使用Luma来计算,容易造…...
Linux iptables使用详解
一、Linux系统下使用iptables 在Linux中,常用的防火墙工具是iptables。以下是一些基本的iptables命令,用于配置防火墙规则。 查看现有的iptables规则: sudo iptables -L 清除所有现有的规则(慎用,可能导致服务不可用…...
算法02 递归算法及其相关问题
递归 在编程中,我们把函数直接或者间接调用自身的过程叫做递归。 递归处理问题的过程是:通常把一个大型的复杂问题,转变成一个与原问题类似的,规模更小的问题来进行求解。 递归的三大要素 函数的参数。在用递归解决问题时&…...
三个pdf工具和浏览软件(pdftk,muppdf,epdfview)
安装pdftk pdftk是一款功能强大的PDF处理工具,主要用于对PDF文件进行各种操作。它提供了丰富的功能,包括但不限于合并、拆分、旋转、加密、解密、添加水印、从PDF文档中解出附件等。pdftk分为图形界面版本和命令行版本,适用于不同的用户需求…...
UKP3d的excel汇总表
长沙某正版用户就EXCEL的图框两点问题,进行交流: 1.1.图框:中英文两行,字体样式,logo加上等个性化需求; cbl回复:9.3后续版本迭代会加图框(解决用户个性化需求)…...
体验亚马逊AIGC——Amazon Bedrock
前言 随着人工智能技术的不断发展,我们已经进入了一个全新的时代,即AI驱动的时代。在这个时代,人工智能已经逐渐成为我们生活中不可或缺的一部分,它可以帮助我们更好地处理各种复杂的问题,提高我们的工作效率ÿ…...
Vue前端服务是什么:深入解析与实际应用
Vue前端服务是什么:深入解析与实际应用 在现今的互联网开发领域,前端技术日新月异,Vue.js作为其中的佼佼者,其前端服务更是成为了众多开发者关注的焦点。那么,Vue前端服务究竟是什么?它有哪些核心要素和实…...
mysql_ssl_rsa_setup使用详解
mysql_ssl_rsa_setup 是一个MySQL附带的工具,用于自动创建SSL证书和密钥文件,以便在MySQL服务器与客户端之间启用安全的SSL/TLS连接。这对于确保数据传输的安全性是非常重要的,尤其是在不安全的网络环境中。下面是对mysql_ssl_rsa_setup使用的…...
FreeSWITCH入门到精通系列(三):FreeSWITCH基础概念与架构
FreeSWITCH入门到精通系列(三):FreeSWITCH基础概念与架构 前言 在前两篇博客中,我们介绍了FreeSWITCH的基本概念和安装与配置。本篇文章将深入探讨FreeSWITCH的基础概念和架构,帮助您更好地理解这个强大的通信平台的…...
【C++】AVL树/红黑树实现及map与set的封装
前言 【C】二叉树进阶(二叉搜索树) 这篇文章讲述了关于二叉搜索树知识,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N)ÿ…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
