当前位置: 首页 > news >正文

代码随想录第十六天|贪心算法(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关键字&#xff1a; 测试代码1&#xff1a; package finaltest.com;public class FinalBasicDemo {public static void main(String[] args) {// final修饰基本数据类型变量final int number 5;// 尝试修改number的值&#xff0c;这将导致编译错误// number 10; // …...

在RK3568上如何烧录MAC?

这里我们用RKDevInfoWriteTool 1.1.4版本 下载地址&#xff1a;https://pan.baidu.com/s/1Y5uNhkyn7D_CjdT98GrlWA?pwdhm30 提 取 码&#xff1a;hm30 烧录过程&#xff1a; 1. 解压RKDevInfoWriteTool_Setup_V1.4_210527.7z 进入解压目录&#xff0c;双击运行RKDevInfo…...

1.30、基于卷积神经网络的手写数字旋转角度预测(matlab)

1、卷积神经网络的手写数字旋转角度预测原理及流程 基于卷积神经网络的手写数字旋转角度预测是一个常见的计算机视觉问题。在这种情况下&#xff0c;我们可以通过构建一个卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;来实现该任务。以下…...

Windows如何使用Python的sphinx

在Windows上使用Python的Sphinx进行文档渲染和呈现&#xff0c;‌可以遵循以下步骤进行操作&#xff1a;‌ 安装Python&#xff1a;‌首先&#xff0c;‌确保你的Windows系统上已经安装了Python。‌你可以从Python的官方网站下载并安装适合你系统&#xff08;‌32位或64位&…...

C++ STL nth_element 用法

一&#xff1a;功能 将一个序列分为两组&#xff0c;前一组元素都小于*nth&#xff0c;后一组元素都大于*nth&#xff0c; 并且确保第 nth 个位置就是排序之后所处的位置。即该位置的元素是该序列中第nth小的数。 二&#xff1a;用法 #include <vector> #include <a…...

【PostgreSQL教程】PostgreSQL 选择数据库

博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...

C# —— HashTable

集合collections命名空间&#xff0c;专门进行一系列的数据存储和检索的类&#xff0c;主要包含了:堆栈、和队列、list、ArrayList、数组 HashTable 字典 storeList 排序列表等类 Array 数组 长度固定&#xff0c; 类型固定 通过索引值来进行访问 ArrayList动态数组&#xff0c…...

LeetCode 第407场周赛个人题解

目录 100372. 使两个整数相等的位更改次数 原题链接 思路分析 AC代码 100335. 字符串元音游戏 原题链接 思路分析 AC代码 100360. 将 1 移动到末尾的最大操作次数 原题链接 思路分析 AC代码 100329. 使数组等于目标数组所需的最少操作次数 原题链接 思路分析 A…...

使用Django框架实现音频上传功能

数据库设计&#xff08;models.py&#xff09; class Music(models.Model):""" 音乐 """name models.CharField(verbose_name"音乐名字", max_length32)singer models.CharField(verbose_name"歌手", max_length32)# 本质…...

[路由器]IP-MAC的绑定与取消

背景&#xff1a;当公司的网络不想与外部人员进行共享&#xff0c;可以在路由器页面配置IP-MAC的绑定&#xff0c;让公司内部人员的手机和电脑的mac&#xff0c;才能接入到公司。第一步&#xff1a;在ARP防护中&#xff0c;启动IP-MAC绑定选项&#xff0c;必须启动仅允许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 实现 函数 判断两个时间戳是否在同一天

函数用于判断两个时间戳是否在同一天。下面是对代码的详细解释&#xff1a; ### 函数参数 - stampA 和 stampB&#xff1a;两个时间戳&#xff0c;用于比较。- resetInfo&#xff1a;一个可选参数&#xff0c;包含小时、分钟和秒数&#xff0c;用于调整时间戳。 ### 函数实现…...

工作纪实53-log4j日志打印文件隔离

在项目中&#xff0c;我有一堆业务日志需要打印&#xff0c;另一部分的日志&#xff0c;是没有格式的&#xff0c;需要被云平台离线解析并收集到kafka或者hdfs、hive等&#xff0c;需要将日志隔离打印到不同的文件 正常的log4j配置是下面这样的&#xff0c;配合Sl4j直接使用默认…...

7月21日,贪心练习

大家好呀&#xff0c;今天带来一些贪心算法的应用解题、 一&#xff0c;柠檬水找零 . - 力扣&#xff08;LeetCode&#xff09; 解析&#xff1a; 本题的贪心体现在对于20美元的处理上&#xff0c;我们总是优先把功能较少的10元作为找零&#xff0c;这样可以让5元用处更大 …...

FPGA DNA 获取 DNA_PORT

FPGA DNA DNA 是 FPGA 芯片的唯一标识&#xff0c; FPGA 都有一个独特的 ID &#xff0c;也就是 Device DNA &#xff0c;这个 ID 相当于我们的身份证&#xff0c;在 FPGA 芯片生产的时候就已经固定在芯片的 eFuse 寄存器中&#xff0c;具有不可修改的属性。在 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

一、背景信息&#xff1a; Transformer是一种由谷歌在2017年提出的深度学习模型。 主要用于自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;特别是序列到序列&#xff08;Sequence-to-Sequence&#xff09;的学习问题&#xff0c;如机器翻译、文本生成等。Transfor…...

spring(二)

一、为对象类型属性赋值 方式一&#xff1a;(引用外部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 设备中恢复丢失或删除的文件。 轻松恢复已删除的文档、照片、音频文件和视频。自定义扫描以帮助恢复特…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

前端工具库lodash与lodash-es区别详解

lodash 和 lodash-es 是同一工具库的两个不同版本&#xff0c;核心功能完全一致&#xff0c;主要区别在于模块化格式和优化方式&#xff0c;适合不同的开发环境。以下是详细对比&#xff1a; 1. 模块化格式 lodash 使用 CommonJS 模块格式&#xff08;require/module.exports&a…...

【Java】Ajax 技术详解

文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...

el-amap-bezier-curve运用及线弧度设置

文章目录 简介示例线弧度属性主要弧度相关属性其他相关样式属性完整示例链接简介 ‌el-amap-bezier-curve 是 Vue-Amap 组件库中的一个组件,用于在 高德地图 上绘制贝塞尔曲线。‌ 基本用法属性path定义曲线的路径,可以是多个弧线段的组合。stroke-weight线条的宽度。stroke…...