数据结构刷题之贪心算法
贪心算法(Greedy Algorithm)
是一种在每个步骤中都选择当前最优解的算法设计策略。它通常用于解决优化问题,例如最小化成本或最大化收益。贪心算法的核心思想是:在每一步选择中,都做出局部最优的选择,希望最终能得到全局最优解。
贪心算法的特点
贪心选择性质:
一个问题的整体最优解可以通过一系列局部最优选择来构造。
每次选择只依赖于当前状态,而不考虑未来的影响。
最优子结构性质:
一个问题的最优解包含其子问题的最优解。
简单高效:
贪心算法通常比动态规划等方法更简单、更高效,但适用范围有限。
经典题目
1.找零问题
给定不同面额的硬币和一个总金额,要求使用最少数量的硬币凑出该金额。
分析一下这个问题:这种问题肯定是先使用大的去找,大的找不完采用晓得,典型的局部最优解–>整体最优解
思路先用大的找->再用小的找
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int minCoins(vector<int>& coins, int amount) {// 对硬币面额从大到小排序sort(coins.begin(), coins.end(), greater<int>());int count = 0; // 记录硬币数量for (int coin : coins) {if (amount == 0) break; // 如果金额为 0,结束循环count += amount / coin; // 使用当前面额的硬币尽可能多amount %= coin; // 更新剩余金额}return amount == 0 ? count : -1; // 如果无法找零,返回 -1
}int main() {vector<int> coins = {1, 5, 10, 25}; // 硬币面额int amount;cout << "请输入总金额: ";cin >> amount;int result = minCoins(coins, amount);if (result != -1) {cout << "最少需要 " << result << " 枚硬币。" << endl;} else {cout << "无法找零。" << endl;}return 0;
}```
2. 活动选择问题
给定一组活动及其开始时间和结束时间,求最多能参加多少个不重叠的活动。
对于活动选择问题,贪心策略通常是优先选择结束时间最早的活动。原因如下:
如果一个活动的结束时间较早,那么它留下的时间窗口就更大,从而为后续活动提供了更多可能的选择。
这种策略确保每次选择都尽可能地为后续活动腾出空间,从而最大化可参加的活动数量。
```cpp
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;struct Activity {int start, end;
};// 按照活动结束时间排序
bool compare(Activity a, Activity b) {return a.end < b.end;
}int maxActivities(vector<Activity>& activities) {// 按结束时间排序sort(activities.begin(), activities.end(), compare);int count = 1; // 至少可以选择第一个活动int lastEnd = activities[0].end;for (int i = 1; i < activities.size(); ++i) {if (activities[i].start >= lastEnd) { // 如果当前活动与上一个活动不冲突count++;lastEnd = activities[i].end; // 更新最后一个活动的结束时间}}return count;
}int main() {vector<Activity> activities = {{1, 3}, {2, 5}, {4, 7}, {6, 9}};cout << "最多可以参加 " << maxActivities(activities) << " 个活动。" << endl;return 0;
}
- 分糖果问题
有若干孩子和糖果,每个孩子有一个贪婪因子(表示至少需要多少糖果才能满足),每个糖果有一个大小。问最多能满足多少孩子?
策略:
优先满足需求最小的孩子:因为需求小的孩子更容易被满足,这样可以腾出更多较大的糖果来满足其他孩子。
优先使用最小的糖果:因为较小的糖果可能无法满足需求大的孩子,但可以满足需求小的孩子。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int findContentChildren(vector<int>& g, vector<int>& s) {// 对孩子的贪婪因子和糖果大小进行排序sort(g.begin(), g.end());sort(s.begin(), s.end());int child = 0, cookie = 0;while (child < g.size() && cookie < s.size()) {if (s[cookie] >= g[child]) { // 如果当前糖果可以满足孩子child++; // 满足的孩子数加 1}cookie++; // 移动到下一个糖果}return child; // 返回满足的孩子数
}int main() {vector<int> g = {1, 2, 3}; // 孩子的贪婪因子vector<int> s = {1, 1}; // 糖果的大小cout << "最多可以满足 " << findContentChildren(g, s) << " 个孩子。" << endl;return 0;
}
- 最优装载问题
有一艘船,载重量为 W,有若干货物,每个货物有重量 w[i]。求最多能装多少货物。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int maxLoad(vector<int>& weights, int W) {// 按货物重量从小到大排序sort(weights.begin(), weights.end());int count = 0; // 记录装入的货物数量for (int weight : weights) {if (W >= weight) { // 如果还能装下当前货物count++;W -= weight; // 更新剩余载重量} else {break;}}return count;
}int main() {vector<int> weights = {4, 8, 1, 5, 2}; // 货物重量int W;cout << "请输入船的最大载重量: ";cin >> W;cout << "最多可以装载 " << maxLoad(weights, W) << " 件货物。" << endl;return 0;
}
相关文章:
数据结构刷题之贪心算法
贪心算法(Greedy Algorithm) 是一种在每个步骤中都选择当前最优解的算法设计策略。它通常用于解决优化问题,例如最小化成本或最大化收益。贪心算法的核心思想是:在每一步选择中,都做出局部最优的选择,希望…...
Spring进阶:掌控Bean的作用域与生命周期
在上一篇文章中,我们了解了Spring IoC容器如何接管对象的创建和依赖注入,实现了松耦合。容器创建并管理的对象,我们称之为Bean。 但是,容器仅仅是创建Bean就够了吗?显然不是。我们还需要关心: 这个Bean在容…...
【Leetcode-Hot100】移动零
题目 解答 首先,使用的解题思路是:使用两个指针,分别指向数组的第一个0元素位置,以该元素位置1为起始点寻找接下来第一个非0元素位置。二者确定后,对其进行交换。随后继续寻找下一个0元素位置。重复上述操作。 但第一…...
安装 Calico 的两种主流方式对比
本文对比了 Calico 的两种主流安装方式: 使用 calico.yaml 的 Manifest 安装方式使用 Tigera Operator(tigera-operator.yaml custom-resources.yaml)安装方式 ✅ 1. 使用 Manifest 方式安装(直接部署 calico.yaml) …...
leetcode_203. 移除链表元素_java
203. 移除链表元素https://leetcode.cn/problems/remove-linked-list-elements/ 1、题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head …...
常见算法模板总结
文章目录 一、二叉树1. DFS2. BFS 二、回溯模板三、记忆化搜索四、动态规划1. 01背包朴素版本滚动数组优化 2. 完全背包朴素版本滚动数组优化 3. 最长递增子序列LIS朴素版本贪心二分优化 4. 最长公共子序列5. 最长回文子串 五、滑动窗口六、二分查找七、单调栈八、单调队列九、…...
UE5学习笔记 FPS游戏制作44 统一UI大小 sizeBox
如果我们希望多个类似的UI大小一样,例如不同菜单的标题,可以使用sizeBox组件 我们在标题控件上,用sizeBox包裹所有子物体 然后指定他的最小宽高,或最大宽高 如果指定的是最小宽高,当子元素(如图片…...
# 基于BERT的文本分类
基于BERT的文本分类项目的实现 一、项目背景 该文本分类项目主要是情感分析,二分类问题,以下是大致流程及部分代码示例: 二、数据集介绍 2.1 数据集基本信息 数据集自定义类型二分类(正面/负面)样本量训练集 验证…...
C++学习之服务器EPOLL模型、处理客户端请求、向客户端回复数、向客户端发送文件
目录 1.启动epoll模型 2.和客户端建立新连接 3.接受客户端Http请求数据 4.代码回顾从接受的数据中读出请求行 5.请求行解析 6.正则表达式以及匹配 7.解析请求行以及后续处理 8.对path处理说明 9.如何回复响应数据 10.对文件对应content-type如何查询 11.服务器处理流…...
BUUCTF-web刷题篇(17)
26.BabyUpload 源码:https://github.com/imaginiso/GXY_CTF/tree/master/Web/babyupload 查看题目源码: 写着:SetHandler application/x-httpd-php 通过源码可以看出这道文件上传题目主要还是考察.htaccess配置文件的特性,倘若…...
国网B接口协议调阅实时视频接口流程详解以及检索失败原因(电网B接口)
文章目录 一、B接口协议调阅实时视频接口介绍B.6.1 接口描述B.6.2 接口流程B.6.3 接口参数B.6.3.1 SIP头字段B.6.3.2 SIP响应码B.6.3.3 SDP参数定义B.6.3.4 RTP动态Payload定义 B.6.4 消息示例B.6.4.1 调阅实时视频请求B.6.4.2 调阅实时视频请求响应 二、B接口调阅实时视频失败…...
windows11下pytorch(cpu)安装
先装anaconda 见最下方 Pytorch 官网:PyTorch 找到下图(不要求版本一样)(我的电脑是集显(有navdia的装gpu),装cpu) 查看已有环境列表 创建环境 conda create –n 虚拟环境名字(…...
NVR接入录像回放平台用EasyCVR打造地下车库安防:大型商居安全优选方案
一、背景分析 随着居民生活品质的提升,大型商业建筑和住宅小区纷纷配套建设地下停车库。但是地下车库盗窃、失火、恶意毁坏车辆、外部人员随意进出等事件频发,部署视频监控系统成为保障地下车库的安全关键举措。 目前,很多商业和住宅都会在…...
玻璃期货数据下载与分析:Python金融实战分享
期货数据下载与分析:Python实战分享 引言 在金融市场中,期货分析是一项重要的工作,而获取准确且及时的数据是进行有效分析的基础。今天,我们将深入探讨一段使用Python编写的代码,该代码用于从郑州商品交易所…...
excel常见错误包括(#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?、#NULL! )
目录 1. #N/A2. #VALUE!3. #REF!4. #DIV/0!5. #NUM!6. #NAME?7. #NULL!8.图表总结 在 Excel 中,可能会遇到以下常见的错误值,每个都有特定的含义和成因: 1. #N/A 含义: 表示“Not Available”(不可用)。…...
乾元通渠道商中标川藏铁路西藏救援队应急救援装备项目
乾元通渠道商中标川藏铁路西藏救援队应急救援装备项目,项目内通信指挥车基于最新一代应急指挥车解决方案打造,配合乾元通自研的车载多链路聚合路由及系统,主要用途为保障应急通讯,满足任务执行时指挥协调、通信联络及数据传输的要…...
数学知识——矩阵乘法
使用矩阵快速幂优化递推问题 对于一个递推问题,如递推式的每一项系数都为常数,我们可以使用矩阵快速幂来对算法进行优化。 一般形式为: F n F 1 A n − 1 F_nF_1A^{n-1} FnF1An−1 由于递推式的每一项系数都为常数,因此对…...
左右开弓策略思路
一、策略概述 本策略是一种基于多种技术指标的复杂交易策略,包括自定义指标计算、过滤平滑处理以及交易信号生成。 该策略通过不同的交易平台代码段实现,旨在通过分析历史价格数据来预测未来价格走势,并据此生成交易信号。 二、主要技术指标…...
将jar包制作成deb一键安装包
文章目录 准备环境准备deb包结构构建Deb包测试安装常用操作命令 本文介绍如何将java运行环境、jar程序一起打包成一个deb格式的安装包,创建桌面图标,通过点击图标可使用系统自带浏览器快捷访问web服务的URL,同时注册服务并配置好开机自启。 准…...
Java 常用安全框架的 授权模型 对比分析,涵盖 RBAC、ABAC、ACL、基于权限/角色 等模型,结合框架实现方式、适用场景和优缺点进行详细说明
以下是 Java 常用安全框架的 授权模型 对比分析,涵盖 RBAC、ABAC、ACL、基于权限/角色 等模型,结合框架实现方式、适用场景和优缺点进行详细说明: 1. 授权模型类型与定义 模型名称定义特点RBAC(基于角色的访问控制)通…...
aws平台练习
注册 AWS 账户 访问 AWS 官方网站,点击“免费注册”按钮,按照提示完成账户注册: 提供电子邮件地址、密码和电话号码。 验证身份(可能需要手机验证码)。 设置 billing 信息。 2. 登录 AWS 管理控制台 使用注册的邮箱和…...
力扣DAY40-45 | 热100 | 二叉树:直径、层次遍历、有序数组->二叉搜索树、验证二叉搜索树、二叉搜索树中第K小的元素、右视图
前言 简单、中等 √ 好久没更了,感觉二叉树来回就那些。有点变懒要警醒,不能止步于笨方法!! 二叉树的直径 我的题解 遍历每个节点,左节点最大深度右节点最大深度当前节点当前节点为中心的直径。如果左节点深度更大…...
【MYSQL从入门到精通】数据类型及建表
一些基础操作语句 1.使用客户端工具连接数据库服务器:mysql -uroot -p 2.查看所有数据库:show databases; 3.创建属于自己的数据库: create database 数据库名;create database if not exists 数据库名; 强烈建议大家在建立数据库时指定编…...
【动态规划】 深入动态规划—两个数组的dp问题
文章目录 前言例题一、最长公共子序列二、不相交的线三、不同的子序列四、通配符匹配五、交错字符串六、两个字符串的最小ASCII删除和七、最长重复子数组 结语 前言 问题本质 它主要围绕着给定的两个数组展开,旨在通过对这两个数组元素间关系的分析,找出…...
结合大语言模型整理叙述并生成思维导图的思路
楔子 我比较喜欢长篇大论。这在代理律师界被视为一种禁忌。 我高中一年级的时候因为入学成绩好(所在县榜眼名次),直接被所在班的班主任任命为班长。我其实不喜欢这个岗位。因为老师一来就要提前注意到,要及时喊“起立”、英语课…...
Kotlin学习
kotlin android 开源,Kotlin开源项目集合_晚安 呼-华为开发者空间 干货来袭,推荐几款开源的Kotlin的Android项目 https://zhuanlan.zhihu.com/p/536789267 【已解决】 ubuntu apt-get update连不上dl.google.com_为什么不能ping谷歌-CSDN博客...
若依前后端分离版本从mysql切换到postgresql数据库
一、修改依赖: 修改admin模块pom.xml中的依赖,屏蔽或删除mysql依赖,增加postgresql依赖。 <!-- Mysql驱动包 --> <!--<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> &l…...
【力扣hot100题】(073)数组中的第K个最大元素
花了两天时间搞明白答案的快速排序和堆排序。 两种都写了一遍,感觉堆排序更简单很多。 两种都记录一下,包括具体方法和易错点。 快速排序 class Solution { public:vector<int> nums;int quicksort(int left,int right,int k){if(leftright) r…...
【AAOS】【源码分析】CarAudioService(二)-- 功能介绍
汽车音频是 Android 汽车操作系统 (AAOS) 的一项功能,允许车辆播放信息娱乐声音,例如媒体、导航和通信。AAOS 不负责具有严格可用性和时间要求的铃声和警告,因为这些声音通常由车辆的硬件处理。将汽车音频服务集成在汽车中,彻底改变了驾驶体验,为驾驶员和乘客提供了音乐、…...
mapbox基础,加载F4Map二维地图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性二、🍀F4Map 简介2.1 ☘️技术特点2.2 ☘️核…...
