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

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++贪心系列

各位小伙伴们新年好呀&#xff0c;这是年后的第一篇文章&#xff0c;那么还是一样&#xff0c;我们继续学习这个贪心算法。 第一题 题目链接 2418. 按身高排序 - 力扣&#xff08;LeetCode&#xff09; 题目解析 代码原理 方法一 1.先创建一个下标数组&#xff0c;将两个数…...

爬虫第七篇数据爬取及解析

这篇博客旨在分享学习过程中的心得和体会&#xff0c;如果有错误请指出&#xff0c;感谢大家。 经过前面的学习&#xff0c;那么我们也就进入了数据爬取的阶段&#xff0c;大家跟着我的步伐一起来学习一下&#xff0c;爬虫的数据爬取与数据解析&#xff08;本篇主要针对于带有…...

LangChain 技术入门指南:探索语言模型的无限可能

在当今的技术领域&#xff0c;LangChain 正逐渐崭露头角&#xff0c;成为开发语言模型应用的强大工具。如果你渴望深入了解并掌握这一技术&#xff0c;那么就跟随本文一起开启 LangChain 的入门之旅吧&#xff01; (后续将持续输出关于LangChain的技术文章,有兴趣的同学可以关注…...

解锁D3.js与PlantUML的交互奥秘:探索知识图谱数据可视化新领域

解锁D3.js与PlantUML的交互魔法&#xff1a;数据可视化新征程 在前端开发的广袤天地里&#xff0c;数据可视化一直是一颗璀璨的明珠&#xff0c;吸引着无数开发者探索其奥秘。而当D3.js这一强大的JavaScript库&#xff0c;遇上专注于创建UML图的PlantUML&#xff0c;一场奇妙的…...

OpenCV机器学习(8)随机森林(Random Forests)算法cv::ml::RTrees类

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::RTrees 是 OpenCV 机器学习模块中的一部分&#xff0c;用于实现随机森林&#xff08;Random Forests&#xff09;算法。随机森林是一种集…...

Java四大框架深度剖析:MyBatis、Spring、SpringMVC与SpringBoot

目录 前言&#xff1a; 一、MyBatis框架 1. 概述 2. 核心特性 3. 应用场景 4. 示例代码 二、Spring框架 1. 概述 2. 核心模块 3. 应用场景 4. 示例代码 三、SpringMVC框架 1. 概述 2. 核心特性 3. 应用场景 4. 示例代码 四、SpringBoot框架 1. 概述 2. 核心…...

MySQL系列之身份鉴别(安全)

导览 前言Q&#xff1a;如何保障MySQL数据库身份鉴别的有效性一、有效性检查 1. 用户唯一2. 启用密码验证3. 是否存在空口令用户4. 是否启用口令复杂度校验5. 是否设置口令的有效期6. 是否限制登录失败尝试次数7. 是否设置&#xff08;超过尝试次数&#xff09;锁定的最小时长…...

纯手工搭建整套CI/CD流水线指南

目录 一、前言 二、环境准备 1、服务器开荒&#xff08;192.168.1.200&#xff09; 2、离线资源清单&#xff08;提前用U盘拷好&#xff09; 三、硬核安装&#xff1a;比拧螺丝还细的步骤 Step1&#xff1a;搭建GitLab&#xff08;注意&#xff01;这是只内存饕餮&#xf…...

侯捷 C++ 课程学习笔记:C++ 基础与演化

一、课程基础要求 在侯捷老师C 课程中&#xff0c;首先强调了学习 C 前应具备的基础知识。这些基础知识对于理解 C 的核心概念和编程技巧至关重要。 掌握某种过程式语言&#xff08;C 语言最佳&#xff09;&#xff1a; 变量&#xff08;Variables&#xff09;&#xff1a;理解…...

LangChain:AI大模型开发与分布式系统设计

文章目录 第一部分&#xff1a;大模型与 LangChain 基础1.1 大语言模型概述1.2 LangChain 基础 第二部分&#xff1a;模型初始化与调用2.1 自定义大模型架构 第三部分&#xff1a;高级模型设计与优化3.1 提示工程与模型调优3.2 高效处理大规模数据 第四部分&#xff1a;分布式系…...

AI赋能编程:PyCharm与DeepSeek的智能开发革命

在这个智能化的时代&#xff0c;人工智能技术正在深刻地改变着我们的工作方式&#xff0c;尤其是在编程领域。无论是初学者还是资深开发者&#xff0c;都希望借助更高效的工具和智能助手来提升生产力、优化代码质量。今天&#xff0c;我们将聚焦于两个强大的工具&#xff1a;Py…...

c++:stack与deque

1.stack使用 1.1empty 作用&#xff1a;判断栈中是否为空 我们看到这里s1初始化的时候是空初始化&#xff0c;所以用empty来判断出的就是空的栈 1.2size size的作用就是判断栈中的数据个数 1.3push 与vector,string,list不同的是,stack中没有头插尾插的概念 因为栈有一个原则&…...

Linux-C/C++《C++/1、C++基础》(C++语言特性、面向对象等)

这里主要介绍概念为主&#xff0c;主要介绍 C与 C 语言中常用的不同点&#xff0c;和一些新的变化。其中不会去说指针、数据类型、变量类型、判断和循环等这些知识&#xff0c;这些和C 语言基本是一样使用的。我们主要学习 C的面向对象编程&#xff0c;对学习 Qt 有很大的帮助。…...

交易所开发:数字市场的核心动力

数字资产交易所作为连接用户与市场的核心枢纽&#xff0c;已成为推动数字经济发展的关键引擎。其开发不仅需要技术创新&#xff0c;还需兼顾用户体验、合规安全与生态构建&#xff0c;以下是交易所开发的核心要素与实践路径分析&#xff1a; 一、交易所的核心定位与技术架构…...

Spring Boot 应用(官网文档解读)

Spring Boot 启动方式 SpringApplication.run(MyApplication.class, args); Spring Boot 故障分析器 在Spring Boot 项目启动发生错误的时候&#xff0c;我们通常可以看到上面的内容&#xff0c;即 APPLICATION FAILED TO START&#xff0c;以及后面的错误描述。这个功能是通过…...

.Net面试宝典【刷题系列】

文章目录 1、JIT是如何工作的2、值类型和引用类型的区别3、解释泛型的基本原理4、如何自定义序列化和反序列化的过程5、如何使用 IFormattable 接口实现格式化输出6、请解释委托的基本原理7、什么是链式委托8、请解释反射的基本原理和其实现的基石9、如何利用反射来实现工厂模式…...

Unity游戏制作中的C#基础(3)加减乘除算术操作符,比较运算符,逻辑与,或运算符

1. 基本算术运算符 算术运算符主要用于对数值类型&#xff08;整型和浮点型&#xff09;进行基本的数学运算。以下是常见的算术运算符及其说明&#xff1a; 运算符描述示例结果加法运算符&#xff0c;用于两个数相加&#xff0c;也可用于字符串连接int a 5 3; string str &…...

如何优化 Webpack 的构建速度?

优化 Webpack 的构建速度是现代前端开发中至关重要的任务。随着项目规模的扩大&#xff0c;构建时间可能会显著增加&#xff0c;影响开发效率。以下是一些实用的方法和策略&#xff0c;以帮助你优化 Webpack 的构建速度。 一、使用生产模式和开发模式 1. 生产模式与开发模式 …...

win10把c盘docker虚拟硬盘映射迁移到别的磁盘

c盘空间本身就比较小、如果安装了docker服务后&#xff0c;安装的时候没选择其他硬盘&#xff0c;虚拟磁盘也在c盘会占用很大的空间&#xff0c;像我的就三十多个G&#xff0c;把它迁移到其他磁盘一下子节约几十G 1、先输入下面命令查看 docker 状态 wsl -l -v 2、如果没有停止…...

conda 配置源

无论是Anaconda vs Miniconda vs Miniforge 中的哪个&#xff0c;只要使用conda就涉及源&#xff0c;换源的目的是为了加速包的获取 修改配置文件 通过修改用户目录下的 .condarc 文件来使用 不同系统下的 .condarc 目录如下&#xff1a; Linux: ${HOME}/.condarcmacOS: ${…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...