代码随想录第十六天|贪心算法(2)
目录
LeetCode 134. 加油站
LeetCode 135. 分发糖果
LeetCode 860. 柠檬水找零
LeetCode 406. 根据身高重建队列
LeetCode 452. 用最少数量的箭引爆气球
LeetCode 435. 无重叠区间
LeetCode 763. 划分字母区间
LeetCode 56. 合并区间
LeetCode 738. 单调递增的数字
总结
歇逼了两天,再次开始
LeetCode 134. 加油站
题目链接:LeetCode 134. 加油站
思想:路过每个加油站的剩余量是gas[i] - cost[i]。那么从0加到第i个加油站的剩余量,如果小于零,说明[0,i]区间内都不能作为起始位置,因为到i就会断油。之后再从i+1位置算起,从0开始计算新一轮的油剩余量。
代码如下:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int index = 0;int sum = 0;int result = 0;for (int i = 0; i < gas.size(); i++) {sum += gas[i] - cost[i];result += gas[i] - cost[i];if (sum < 0) {index = i + 1;sum = 0;}}if (result < 0) return -1;return index;}
时间复杂度:O(n),空间复杂度:O(1)。
LeetCode 135. 分发糖果
题目链接:LeetCode 135. 分发糖果
思想:因为除了开头和结尾的孩子,每个孩子都有相邻的两个方向左边和右边,不能同时考虑,所以本题应该要分开考虑,即先考虑孩子的右边,再考虑孩子的左边。先考虑孩子的右边,从前往后遍历,如果右孩子的评级高于当前孩子的话,右孩子分配到的糖果应当是当前孩子分配到的+1;再考虑左孩子,从后往前遍历,如果左孩子的评级高于当前孩子的话,左孩子分配到的糖果应当是左孩子原本分配到的糖果与当前孩子分配到的糖果+1取最大值。因为前面我们已经遍历且分配了一轮糖果了,不再是原本大家都是1糖果了,所以这里要取最大。
代码如下:
int candy(vector<int>& ratings) {vector<int> candyNums(ratings.size(), 1);for (int i = 0; i < ratings.size() - 1; i++) {if (ratings[i] < ratings[i + 1]) {candyNums[i + 1] = candyNums[i] + 1;}}for (int i = ratings.size() - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1]) {candyNums[i] = max(candyNums[i], candyNums[i + 1] + 1);}}int minCandy = 0;for (int i = 0; i < candyNums.size(); i++) minCandy += candyNums[i];return minCandy;}
时间复杂度:O(n),空间复杂度:O(1)。
LeetCode 860. 柠檬水找零
题目链接:LeetCode 860. 柠檬水找零
思想:本题其实十分简单,遇到5就收下;遇到10,就查看5是否有多余的,如果有就收下10,指出1张5,如果没有就return false;遇到20,优先支出1张10和1张5,因为收到的10只能用于20的补零,而5可以补10和20,灵活度更高,如果没有1张10和1张5的话,就支出3张5,如果没有3张5的话就return false。
代码如下:
bool lemonadeChange(vector<int>& bills) {int five = 0;int ten = 0;int twenty = 0;for (int i = 0; i < bills.size(); i++) {if (bills[i] == 5) five++;else if (bills[i] == 10) {if (five > 0) {five--;ten++;}else {return false;}}else {if (ten > 0 && five > 0) {five--;ten--;twenty++;} else if (five > 2) {five-=3;twenty++;} else {return false;}}}return true;}
时间复杂度:O(n),空间复杂度:O(1)。
LeetCode 406. 根据身高重建队列
题目链接:LeetCode 406. 根据身高重建队列
思想:因为本题是根据身高来重建队列,[h,k]分别是身高h和队列里前面有k个高于当前的人。所以可以按照身高h来先重新排列,从大到小,如果身高相同的话则k小的站前面,让高个子站前面。之后就遍历新排列的数组,按照k来插入到新数组,插入不影响前后顺序。
代码:
static bool cmp(const vector<int>& a, const vector<int>& b) {return a[0] == b[0] ? a[1] < b[1] : 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 position = people[i][1];result.insert(result.begin() + position, people[i]);}return result;}
时间复杂度:O(nlogn),空间复杂度:O(n)。
LeetCode 452. 用最少数量的箭引爆气球
题目链接:LeetCode 452. 用最少数量的箭引爆气球
思想:因为所有气球位置在数组里面是随机排列的,所以现在我们可以先对数组进行一个排序,对气球的左边界排序,小的在前面,大的在后面。然后遍历数组里面的元素,如果当前气球的左边界大于上一个气球的右边界的话,就需要多一个箭头;反之就让当前气球的右边界等于上一个气球的右边界,也就是可以用同一个箭头处理这一类的气球。
代码如下:
static bool cmp(vector<int>& a, vector<int>& b) {return a[0] < b[0];} int findMinArrowShots(vector<vector<int>>& points) {if (points.size() == 0) return 0;sort(points.begin(), points.end(), cmp);int result = 1;for (int i = 1; i < points.size(); i++) {if (points[i][0] > points[i - 1][1]) {result++;} else {points[i][1] = min(points[i - 1][1], points[i][1]);}}return result;}
时间复杂度:O(nlogn),空间复杂度:O(1)。
LeetCode 435. 无重叠区间
题目链接:LeetCode 435. 无重叠区间
思想:首先本题也需要先重新排序输入数组,这里我选择的根据一个区间的左边界来进行排序,接下来就是找出重叠的区间,先标记一个区间的起始点,这里分为从前往后还是从后往前,这里我选择从后往前,这样做的原因是非常好进行对比。对比什么呢,如果这个标记点大于等于前一个区间的右边界的话,说明两个区间重叠了,就令标记点等于前一个区间的左边界,令重复数组标记+1。最后返回区间个数-重复数组的个数。
代码如下:
static bool cmp(vector<int>& a, vector<int>& b) {return a[0] < b[0];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 0) return 0;sort(intervals.begin(), intervals.end(), cmp);int result = 1;int start = intervals[intervals.size() - 1][0];for (int i = intervals.size() - 1; i > 0; i--) {if (start >= intervals[i - 1][1]) {start = intervals[i - 1][0];result++;} else {continue;}}return intervals.size() - result;}
时间复杂度:O(nlogn),空间复杂度:O(1)。
LeetCode 763. 划分字母区间
题目链接:LeetCode 763. 划分字母区间
思想:要让同一个字母最多出现在一个片段中,首先就要记录一个字母最后出现的下标。然后遍历这个字符串,标记一个片段的左边界和右边界,左右边界最开始为0,右边界在遍历的过程中等于右边界和当前字母最后出现的下标取最大值,如果遇到当前遍历的下标和右边界相等之后,就往结果数组压入当前的长度,即right - left + 1,左边界就更新为i + 1。
代码如下:
vector<int> partitionLabels(string s) {int hash[27] = {0};for (int i = 0; i < s.size(); i++) {hash[s[i] - 'a'] = i;}int left = 0;int right = 0;vector<int> result;for (int i = 0; i < s.size(); i++) {right = max(right, hash[s[i] - 'a']);if (i == right) {result.push_back(right - left + 1);left = i + 1;}}return result;}
时间复杂度:O(n),空间复杂度:O(1)。
LeetCode 56. 合并区间
题目链接:LeetCode 56. 合并区间
思想:本题首先需要借用一个额外的数组来存储合并区间,如果只是在原来的数组上合并并更改区间的话,会导致遍历中遍历不完数组或者数组越界的情况。首先本题也需要对数组进行排序,我采用的是对左边界排序,然后往结果数组里面存放第一个区间,再遍历排序过后的区间数组,如果结果数组的最后一个区间的右边界大于或等于区间数组当前区间的左边界的话,说明两个区间重叠了,就进行合并,就是更改结果数组中的最后一个区间的右边界等于本身和区间数组当前区间的右边界取最大值;如果小于的话,就直接放入结果数组。
代码如下:
static bool cmp(vector<int>& a, vector<int>& b) {return a[0] < b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> result;if(intervals.size() == 0) return intervals;sort(intervals.begin(), intervals.end(), cmp);result.push_back(intervals[0]); for (int i = 1; i < intervals.size(); i++) {if (result.back()[1] >= intervals[i][0]) {result.back()[1] = max(result.back()[1], intervals[i][1]);} else {result.push_back(intervals[i]);}}return result;}
时间复杂度:O(nlogn),空间复杂度:O(n)。
LeetCode 738. 单调递增的数字
题目链接:LeetCode 738. 单调递增的数字
思想:本题有一个十分有趣的规律,就是如果要使一个数字成为一个单调递增的数字的话,如果它本身不是,则可以先找到它不满足单调递增的地方,例如123123123,就需要找到第二个1的地方,令其减小一位,将其后面满足单调递增的数字改为9,第三个123也是如此操作。
代码如下:
int monotoneIncreasingDigits(int n) {vector<int> count;if (n == 0) return 0;while (n) {count.push_back(n % 10);n = n / 10;}int flag = -1;for (int i = 0; i < count.size() - 1; i++) {if (count[i] < count[i + 1]) {count[i + 1]--;flag = i;}}int sum = 0;for (int i = flag; i >= 0; i--) {count[i] = 9;}for (int i = 0; i < count.size(); i++) {sum += count[i] * pow(10, i);}return sum;}
时间复杂度:O(n),空间复杂度:O(n)。
总结
贪心算法没学到什么,能自己做出来的屈指可数,不过学到了sort函数的新方法,可以根据自定义的函数来进行排序。
相关文章:
代码随想录第十六天|贪心算法(2)
目录 LeetCode 134. 加油站 LeetCode 135. 分发糖果 LeetCode 860. 柠檬水找零 LeetCode 406. 根据身高重建队列 LeetCode 452. 用最少数量的箭引爆气球 LeetCode 435. 无重叠区间 LeetCode 763. 划分字母区间 LeetCode 56. 合并区间 LeetCode 738. 单调递增的数字 总…...
花几千上万学习Java,真没必要!(二十二)
1、final关键字: 测试代码1: package finaltest.com;public class FinalBasicDemo {public static void main(String[] args) {// final修饰基本数据类型变量final int number 5;// 尝试修改number的值,这将导致编译错误// number 10; // …...
在RK3568上如何烧录MAC?
这里我们用RKDevInfoWriteTool 1.1.4版本 下载地址:https://pan.baidu.com/s/1Y5uNhkyn7D_CjdT98GrlWA?pwdhm30 提 取 码:hm30 烧录过程: 1. 解压RKDevInfoWriteTool_Setup_V1.4_210527.7z 进入解压目录,双击运行RKDevInfo…...
1.30、基于卷积神经网络的手写数字旋转角度预测(matlab)
1、卷积神经网络的手写数字旋转角度预测原理及流程 基于卷积神经网络的手写数字旋转角度预测是一个常见的计算机视觉问题。在这种情况下,我们可以通过构建一个卷积神经网络(Convolutional Neural Network,CNN)来实现该任务。以下…...
Windows如何使用Python的sphinx
在Windows上使用Python的Sphinx进行文档渲染和呈现,可以遵循以下步骤进行操作: 安装Python:首先,确保你的Windows系统上已经安装了Python。你可以从Python的官方网站下载并安装适合你系统(32位或64位&…...
C++ STL nth_element 用法
一:功能 将一个序列分为两组,前一组元素都小于*nth,后一组元素都大于*nth, 并且确保第 nth 个位置就是排序之后所处的位置。即该位置的元素是该序列中第nth小的数。 二:用法 #include <vector> #include <a…...
【PostgreSQL教程】PostgreSQL 选择数据库
博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...
C# —— HashTable
集合collections命名空间,专门进行一系列的数据存储和检索的类,主要包含了:堆栈、和队列、list、ArrayList、数组 HashTable 字典 storeList 排序列表等类 Array 数组 长度固定, 类型固定 通过索引值来进行访问 ArrayList动态数组,…...
LeetCode 第407场周赛个人题解
目录 100372. 使两个整数相等的位更改次数 原题链接 思路分析 AC代码 100335. 字符串元音游戏 原题链接 思路分析 AC代码 100360. 将 1 移动到末尾的最大操作次数 原题链接 思路分析 AC代码 100329. 使数组等于目标数组所需的最少操作次数 原题链接 思路分析 A…...
使用Django框架实现音频上传功能
数据库设计(models.py) class Music(models.Model):""" 音乐 """name models.CharField(verbose_name"音乐名字", max_length32)singer models.CharField(verbose_name"歌手", max_length32)# 本质…...
[路由器]IP-MAC的绑定与取消
背景:当公司的网络不想与外部人员进行共享,可以在路由器页面配置IP-MAC的绑定,让公司内部人员的手机和电脑的mac,才能接入到公司。第一步:在ARP防护中,启动IP-MAC绑定选项,必须启动仅允许IP-MAC…...
Idea配置远程开发
Idea配置远程开发 本篇博客介绍使用idea通过ssh连接ubuntu服务器进行开发 目录 Idea配置远程开发1.idae上点击file->Remote Development2.点击New Connection3.填写相关信息4.输入密码5.选择IDE版本和项目路径5.1 点击open an SSH terminal打开控制台5.2 依次执行命令 6.成…...
lua 实现 函数 判断两个时间戳是否在同一天
函数用于判断两个时间戳是否在同一天。下面是对代码的详细解释: ### 函数参数 - stampA 和 stampB:两个时间戳,用于比较。- resetInfo:一个可选参数,包含小时、分钟和秒数,用于调整时间戳。 ### 函数实现…...
工作纪实53-log4j日志打印文件隔离
在项目中,我有一堆业务日志需要打印,另一部分的日志,是没有格式的,需要被云平台离线解析并收集到kafka或者hdfs、hive等,需要将日志隔离打印到不同的文件 正常的log4j配置是下面这样的,配合Sl4j直接使用默认…...
7月21日,贪心练习
大家好呀,今天带来一些贪心算法的应用解题、 一,柠檬水找零 . - 力扣(LeetCode) 解析: 本题的贪心体现在对于20美元的处理上,我们总是优先把功能较少的10元作为找零,这样可以让5元用处更大 …...
FPGA DNA 获取 DNA_PORT
FPGA DNA DNA 是 FPGA 芯片的唯一标识, FPGA 都有一个独特的 ID ,也就是 Device DNA ,这个 ID 相当于我们的身份证,在 FPGA 芯片生产的时候就已经固定在芯片的 eFuse 寄存器中,具有不可修改的属性。在 xilinx 7series…...
使用 hutool工具实现导入导出功能。
hutool工具网址 Hutool参考文档 pom依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.20</version></dependency><dependency><groupId>org.apache.poi</gro…...
大语言模型-Transformer-Attention Is All You Need
一、背景信息: Transformer是一种由谷歌在2017年提出的深度学习模型。 主要用于自然语言处理(NLP)任务,特别是序列到序列(Sequence-to-Sequence)的学习问题,如机器翻译、文本生成等。Transfor…...
spring(二)
一、为对象类型属性赋值 方式一:(引用外部bean) 1.创建班级类Clazz package com.spring.beanpublic class Clazz {private Integer clazzId;private String clazzName;public Integer getClazzId() {return clazzId;}public void setClazzId(Integer clazzId) {th…...
MAC 数据恢复软件: STELLAR Data Recovery For MAC V. 12.1 更多增强功能
天津鸿萌科贸发展有限公司是 Stellar 系列软件的授权代理商。 STELLAR Data Recovery For MAC 该数据恢复软件可从任何存储驱动器、清空的回收站以及崩溃或无法启动的 Mac 设备中恢复丢失或删除的文件。 轻松恢复已删除的文档、照片、音频文件和视频。自定义扫描以帮助恢复特…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
