c++贪心系列
各位小伙伴们新年好呀,这是年后的第一篇文章,那么还是一样,我们继续学习这个贪心算法。
第一题
题目链接
2418. 按身高排序 - 力扣(LeetCode)
题目解析

代码原理

方法一
1.先创建一个下标数组,将两个数组所对应的数据的下标创建成一个数组
2.对下标数组进行排序,依靠升高的数据对下标数组进行排序
3.通过重新排序后的下标数组进行重新尾插names数组的数据
方法二
1.使用哈希表存映射关系
2.对身高数组进行排序
3.根据排序后的结果,往哈希表里找名字
代码编写
方法一
class Solution {
public:
vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
int n = names.size();
vector<int> index(n);
for(int i = 0; i < n; i++)
{
index[i] = i;
}//先创建一个下标数组
sort(index.begin(), index.end(), [&](const int i, const int j)
{
return heights[i] > heights[j];
});//排序
vector<string> ret;
for(auto cur: index)
{
ret.push_back(names[cur]);
}//重新尾插
return ret;
}
};
方法二
class Solution {
public:
vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
int n = names.size();
unordered_map<int, string> hash(n);
for(int i = 0; i < n; i++)
{
hash[heights[i]] = names[i];
}
sort(heights.begin(), heights.end(), greater<int>());
vector<string> ret;
for(int i = 0; i < n; i++)
{
ret.push_back(hash[heights[i]]);
}
return ret;
}
};
本题总结
如何想到
出现两组数据,且是可以一一对应的关系
方法&思路
1.哈希表,类型是unorder_map<数据类型一, 数据类型二>,然后重新插入另一个数组的数据
2.将两个数组所对应的数据的下标创建成一个数组,先根据一个数组的数据大小进行排序,再重新插入另一个数组的数据
第二题
在讲解这题之前,如果小伙伴们感兴趣可以先去了解一下田忌赛马这个故事,当然,博主也给大家准备了一个类似田忌赛马故事的小视频
日常分享
题目链接
870. 优势洗牌 - 力扣(LeetCode)
题目解析

根据视频中的田忌赛马原理,先用一组数据中的最小值与另一组的最小值进行比较,若比不过则拖走对面的最大值
代码原理
原理大家都已经清楚了,就是田忌赛马,但是如何把它转化成代码呢?利用指针即可当第一组中的最小值小于第二组的最小值时,直接将其从右边插入到结果的数组中,反之,则从左边插入
其次这里也用到了上一题我们总结过的下标数组,先将第一组的数据进行排序,并取它们的下标作为数组,之后再根据下标数组对第二个数组进行排序
代码编写
class Solution {
public:
vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
//将第一数组进行排序
sort(nums1.begin(), nums1.end());
//创建下标数组
int n = nums1.size();
vector<int> index(n);
for(int i = 0; i < n; i++)
{
index[i] = i;
}
//对第二个数组进行排序
sort(index.begin(), index.end(), [&](const int& i, const int& j){
return nums2[i] < nums2[j];
//nums2[i] > nums2[j] 这是降序
});
//小圣贤庄比武
vector<int> ret(n);
int left = 0, right = n - 1;
for(auto cur: nums1)
{
if(cur > nums2[index[left]]) ret[index[left++]] = cur;
else ret[index[right--]] = cur;
}
return ret;
}
};
本题总结
方法总结
题型特征
类似田忌赛马
方法&思路
思路:田忌赛马的思路、下标数组、根据下标数组进行排序
方法:利用指针即可当第一组中的最小值小于第二组的最小值时,直接将其从右边插入到结果的数组中,反之,则从左边插入
第三题
题目链接
409. 最长回文串 - 力扣(LeetCode)
题目解析

回文数组:以某一个字母为对称轴,对称轴两边的字母要保持一模一样
上图中的回文数组的长度要从第一个d开始算起
注意:只有一个字母时也是回文数组
代码原理
1. 如果字符的个数偶数个,那么全部都可以⽤来构造回⽂串;
2. 如果字符的个数奇数个,减去⼀个之后,剩下的字符能够全部⽤来构造回⽂串;
3. 最后再判断⼀下,如果有字符出现奇数个,就把它单独拿出来放在中间。
那么如何统计字符个数,我们使用哈希表即可(如何写,见代码编写部分)
代码编写
class Solution {
public:
int longestPalindrome(string s) {
int hash[2010];
//计数
for(auto cur: s)
{
hash[cur]++;
}
//统计结果
int ret = 0;
for(auto cur: hash)
{
ret += cur / 2 * 2;//这里只统计了偶数部分
}
return ret < s.size()? ret + 1: ret;
}
};
本题总结
思路&方法
哈希表计数:hash[cur]++
cur/2*2的思路

第四题
题目链接
942. 增减字符串匹配 - 力扣(LeetCode)
题目解析

代码原理
遇到‘I’则prem[i]这个位置的数此时是最小的
遇到‘D’则prem[i]这个位置的数此时是最大的
代码编写
class Solution {
public:
vector<int> diStringMatch(string s) {
int n = s.size();
vector<int> ret;
int left = 0, right = n;
for(auto cur: s)
{
if(cur == 'I') ret.push_back(left++);
else ret.push_back(right--);
}
ret.push_back(left);//把最后一个数放进去
return ret;
}
};
第五题
题目链接
455. 分发饼干 - 力扣(LeetCode)
题目解析

代码原理
优先满足胃口小的小朋友
代码编写
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int ret = 0, m = g.size(), n = s.size();
for(int i = 0, j = 0; i < m && j < n; i++, j++)
{
while(j < n && s[j] < g[i])
{
j++;
}
if(j < n) ret++;
}
return ret;
}
};
第六题
题目链接
553. 最优除法 - 力扣(LeetCode)
题目解析

代码原理
a * c * d / b
代码编写
class Solution {
public:
string optimalDivision(vector<int>& nums) {
int n = nums.size();
if(n == 1)
{
return to_string(nums[0]);
}
if(n == 2)
{
return to_string(nums[0]) + "/" + to_string(nums[1]);
}
string ret;
ret = to_string(nums[0]) + "/(" + to_string(nums[1]);
for(int i = 2; i < n; i++)
{
ret += "/" + to_string(nums[i]);
}
ret += ")";
return ret;
}
};
本题总结
方法&思路
思路:a * c * d / b
方法:to_string(元素)//用于转换数据类型
第七题
题目链接
45. 跳跃游戏 II - 力扣(LeetCode)
题目解析

代码原理

代码编写
class Solution {
public:
int jump(vector<int>& nums) {
int n = nums.size();
int left = 0, right = 0, ret = 0, max_position = 0;
while(left <= right)
{
if(max_position >= n - 1) return ret;
for(int i = left; i <= right; i++)
{
max_position = max(max_position, nums[i] + i);
}
left = right + 1;
right = max_position;
ret++;
}
return -1;
}
};
思路总结:
先模拟走一遍,拿到最大长度后,先更新left和right,再判断是否能够到达最后一个位置,若能达到则返回次数,反之则返回-1。其中更新left和right时先更新left,再更新right,并且right要为往后的最大长度。
变式题
题目链接
55. 跳跃游戏 - 力扣(LeetCode)
代码编写
class Solution {
public:
bool canJump(vector<int>& nums) {
int ret = 0, left = 0, right = 0, maxPos = 0;
int n = nums.size();
while(left <= right)
{
if(right >= n - 1) return true;
for(int i = left; i <= right; i++)
{
maxPos = max(maxPos, nums[i] + i);
}
left = right + 1;
right = maxPos;
}
return false;
}
};
第九题
题目链接
题目解析

代码原理

规律怎么来?

代码编写
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
for(int i = 0; i < n; i++)
{
int ret = 0, step = 0, index = 0;
for(; step < n; step++)
{
index = (i + step) % n;
ret += gas[index] - cost[index];
if(ret < 0) break;
}
if(ret >= 0) return i;
i += index;
}
return -1;
}
};
本题总结
如何提取规律
结合题意,借用仅有的例子,列举一些符合题意和不合题意的例子,从中总结一些规律
本篇文章的内容就先到这里,我们下期文章再见!!!

相关文章:
c++贪心系列
各位小伙伴们新年好呀,这是年后的第一篇文章,那么还是一样,我们继续学习这个贪心算法。 第一题 题目链接 2418. 按身高排序 - 力扣(LeetCode) 题目解析 代码原理 方法一 1.先创建一个下标数组,将两个数…...
爬虫第七篇数据爬取及解析
这篇博客旨在分享学习过程中的心得和体会,如果有错误请指出,感谢大家。 经过前面的学习,那么我们也就进入了数据爬取的阶段,大家跟着我的步伐一起来学习一下,爬虫的数据爬取与数据解析(本篇主要针对于带有…...
LangChain 技术入门指南:探索语言模型的无限可能
在当今的技术领域,LangChain 正逐渐崭露头角,成为开发语言模型应用的强大工具。如果你渴望深入了解并掌握这一技术,那么就跟随本文一起开启 LangChain 的入门之旅吧! (后续将持续输出关于LangChain的技术文章,有兴趣的同学可以关注…...
解锁D3.js与PlantUML的交互奥秘:探索知识图谱数据可视化新领域
解锁D3.js与PlantUML的交互魔法:数据可视化新征程 在前端开发的广袤天地里,数据可视化一直是一颗璀璨的明珠,吸引着无数开发者探索其奥秘。而当D3.js这一强大的JavaScript库,遇上专注于创建UML图的PlantUML,一场奇妙的…...
OpenCV机器学习(8)随机森林(Random Forests)算法cv::ml::RTrees类
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::RTrees 是 OpenCV 机器学习模块中的一部分,用于实现随机森林(Random Forests)算法。随机森林是一种集…...
Java四大框架深度剖析:MyBatis、Spring、SpringMVC与SpringBoot
目录 前言: 一、MyBatis框架 1. 概述 2. 核心特性 3. 应用场景 4. 示例代码 二、Spring框架 1. 概述 2. 核心模块 3. 应用场景 4. 示例代码 三、SpringMVC框架 1. 概述 2. 核心特性 3. 应用场景 4. 示例代码 四、SpringBoot框架 1. 概述 2. 核心…...
MySQL系列之身份鉴别(安全)
导览 前言Q:如何保障MySQL数据库身份鉴别的有效性一、有效性检查 1. 用户唯一2. 启用密码验证3. 是否存在空口令用户4. 是否启用口令复杂度校验5. 是否设置口令的有效期6. 是否限制登录失败尝试次数7. 是否设置(超过尝试次数)锁定的最小时长…...
纯手工搭建整套CI/CD流水线指南
目录 一、前言 二、环境准备 1、服务器开荒(192.168.1.200) 2、离线资源清单(提前用U盘拷好) 三、硬核安装:比拧螺丝还细的步骤 Step1:搭建GitLab(注意!这是只内存饕餮…...
侯捷 C++ 课程学习笔记:C++ 基础与演化
一、课程基础要求 在侯捷老师C 课程中,首先强调了学习 C 前应具备的基础知识。这些基础知识对于理解 C 的核心概念和编程技巧至关重要。 掌握某种过程式语言(C 语言最佳): 变量(Variables):理解…...
LangChain:AI大模型开发与分布式系统设计
文章目录 第一部分:大模型与 LangChain 基础1.1 大语言模型概述1.2 LangChain 基础 第二部分:模型初始化与调用2.1 自定义大模型架构 第三部分:高级模型设计与优化3.1 提示工程与模型调优3.2 高效处理大规模数据 第四部分:分布式系…...
AI赋能编程:PyCharm与DeepSeek的智能开发革命
在这个智能化的时代,人工智能技术正在深刻地改变着我们的工作方式,尤其是在编程领域。无论是初学者还是资深开发者,都希望借助更高效的工具和智能助手来提升生产力、优化代码质量。今天,我们将聚焦于两个强大的工具:Py…...
c++:stack与deque
1.stack使用 1.1empty 作用:判断栈中是否为空 我们看到这里s1初始化的时候是空初始化,所以用empty来判断出的就是空的栈 1.2size size的作用就是判断栈中的数据个数 1.3push 与vector,string,list不同的是,stack中没有头插尾插的概念 因为栈有一个原则&…...
Linux-C/C++《C++/1、C++基础》(C++语言特性、面向对象等)
这里主要介绍概念为主,主要介绍 C与 C 语言中常用的不同点,和一些新的变化。其中不会去说指针、数据类型、变量类型、判断和循环等这些知识,这些和C 语言基本是一样使用的。我们主要学习 C的面向对象编程,对学习 Qt 有很大的帮助。…...
交易所开发:数字市场的核心动力
数字资产交易所作为连接用户与市场的核心枢纽,已成为推动数字经济发展的关键引擎。其开发不仅需要技术创新,还需兼顾用户体验、合规安全与生态构建,以下是交易所开发的核心要素与实践路径分析: 一、交易所的核心定位与技术架构…...
Spring Boot 应用(官网文档解读)
Spring Boot 启动方式 SpringApplication.run(MyApplication.class, args); Spring Boot 故障分析器 在Spring Boot 项目启动发生错误的时候,我们通常可以看到上面的内容,即 APPLICATION FAILED TO START,以及后面的错误描述。这个功能是通过…...
.Net面试宝典【刷题系列】
文章目录 1、JIT是如何工作的2、值类型和引用类型的区别3、解释泛型的基本原理4、如何自定义序列化和反序列化的过程5、如何使用 IFormattable 接口实现格式化输出6、请解释委托的基本原理7、什么是链式委托8、请解释反射的基本原理和其实现的基石9、如何利用反射来实现工厂模式…...
Unity游戏制作中的C#基础(3)加减乘除算术操作符,比较运算符,逻辑与,或运算符
1. 基本算术运算符 算术运算符主要用于对数值类型(整型和浮点型)进行基本的数学运算。以下是常见的算术运算符及其说明: 运算符描述示例结果加法运算符,用于两个数相加,也可用于字符串连接int a 5 3; string str &…...
如何优化 Webpack 的构建速度?
优化 Webpack 的构建速度是现代前端开发中至关重要的任务。随着项目规模的扩大,构建时间可能会显著增加,影响开发效率。以下是一些实用的方法和策略,以帮助你优化 Webpack 的构建速度。 一、使用生产模式和开发模式 1. 生产模式与开发模式 …...
win10把c盘docker虚拟硬盘映射迁移到别的磁盘
c盘空间本身就比较小、如果安装了docker服务后,安装的时候没选择其他硬盘,虚拟磁盘也在c盘会占用很大的空间,像我的就三十多个G,把它迁移到其他磁盘一下子节约几十G 1、先输入下面命令查看 docker 状态 wsl -l -v 2、如果没有停止…...
conda 配置源
无论是Anaconda vs Miniconda vs Miniforge 中的哪个,只要使用conda就涉及源,换源的目的是为了加速包的获取 修改配置文件 通过修改用户目录下的 .condarc 文件来使用 不同系统下的 .condarc 目录如下: Linux: ${HOME}/.condarcmacOS: ${…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
