贪心算法解题框架+经典反例分析,效率提升300%
贪心算法是一种在每一步选择中都采取当前状态下的最优决策,从而希望最终达到全局最优解的算法策略。以下从其定义、特点、一般步骤、应用场景及实例等方面进行讲解:
定义与基本思想
• 贪心算法在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。它通常以自顶向下的方式进行,每一步都选择当前的最优解,而不考虑之前或之后的步骤。
特点
• 无后效性:即某个状态以前的过程不会影响以后的状态,只与当前状态有关。这使得贪心算法在每一步决策时,只需要考虑当前的状态信息,而不必考虑整个问题的历史信息。
• 局部最优选择:贪心算法在每一步都选择当前看起来最优的决策,而不考虑整体的最优解。这种局部最优选择策略是贪心算法的核心特点,也是其与动态规划等其他算法的主要区别之一。
一般解题步骤
- 问题分析:明确问题的目标和约束条件,确定问题是否适合用贪心算法求解。一般来说,如果问题具有最优子结构性质和贪心选择性质,就可以考虑使用贪心算法。
- 贪心策略设计:根据问题的特点,设计一个贪心策略。贪心策略的好坏直接影响算法的正确性和效率。例如,在活动安排问题中,贪心策略可以是按照活动结束时间的先后顺序来选择活动。
- 算法实现:根据贪心策略,实现具体的算法。在实现过程中,需要注意数据结构的选择和操作,以提高算法的效率。
- 正确性证明:虽然贪心算法通常比较直观,但为了确保算法的正确性,需要对贪心策略进行证明。证明方法通常有归纳法、反证法等。
应用场景
一、区间调度问题
【核心思路】:通过排序区间端点,选择不重叠区间的最大数量或最优安排方式。
【解决思路】:
- 排序策略:按区间右端点从小到大排序。
- 贪心选择:依次选择最早结束且不与已选区间重叠的区间。
- 优化目标:最大化不重叠区间数量。
【经典题型】:
线段覆盖:选择最多不重叠线段,按右端点排序后贪心选择。
纪念品分组:将物品按价格排序后,双指针组合最大可能的配对,使组数最少。
智力大冲浪:按扣款数从大到小排序,尽量在截止时间前完成任务以减少罚款5。
种树问题:按区间右端点排序,从后向前填充以满足多个区间需求。
洛谷例题:P1803(线段覆盖)、P1094(纪念品分组)、P1230(智力大冲浪)、P1250(种树)。
参考P1094纪念品分组
二、排序选择问题
【核心思路】:通过排序后选择局部最优解,通常与性价比、时间顺序相关。
【解决思路】:
- 部分背包:按单位价值(价值/重量)降序排序,优先拿取高性价比物品。
- 排队接水:按接水时间升序排序,最小化总等待时间。
【 典型场景】:
◦ 部分背包问题:按单位价值排序,优先拿取性价比高的物品37。
◦ 排队接水:按接水时间升序排列,总等待时间最小35。
◦ 陶陶摘苹果:按摘取所需体力排序,优先摘取消耗小的苹果3。
• 洛谷例题:P2240(部分背包)、P1223(排队接水)、P1478(陶陶摘苹果)、P4995(跳跳!)。
参考P2240部分背包问题
三.构造最优解问题
【核心思路】:通过删除或调整元素构造最小/最大值,需处理边界条件。
【高频题目】:
◦ 删数问题:删除k个数字使剩余数最小,需从左到右删除第一个递减序列的前驱389。
◦ 铺设道路:通过相邻差值累加计算最小天数,递推处理连续区间9。
◦ 分组问题:将连续数值分组,使用栈维护最小长度的最大可能9。
• 洛谷例题:P1106(删数问题)、P5019(铺设道路)、P4447(AHOI2018分组)。
参考P1106删数问题
四、反悔贪心与堆优化
核心思路:通过**优先队列(堆)**动态维护当前最优选择,支持撤销操作。
• 典型应用:
◦ 合并果子:每次合并最小的两堆,用小根堆优化时间复杂度7。
◦ 推销员问题:结合最大疲劳值与距离的权衡,分情况选择最优策略10。
• 洛谷例题:P1090(合并果子)、P2672(推销员)。
参考P1090合并果子
五、特殊策略问题
核心思路:需结合题目特性设计贪心规则,如数学归纳或调整法。
• 常见题型:
◦ 小A的糖果:遍历调整相邻盒子的糖果数,确保总和不超过限制37。
◦ 跳跳!:在最大和最小值之间跳跃,最大化总能量3。
◦ 哈夫曼编码:合并频率最小的节点,构造最优前缀树25。
• 洛谷例题:P3817(小A的糖果)、P4995(跳跳!)、P2168(荷马史诗)。
相关文章:
贪心算法解题框架+经典反例分析,效率提升300%
贪心算法是一种在每一步选择中都采取当前状态下的最优决策,从而希望最终达到全局最优解的算法策略。以下从其定义、特点、一般步骤、应用场景及实例等方面进行讲解: 定义与基本思想 • 贪心算法在对问题求解时,总是做出在当前看来是最好的选…...
《基于机器学习的DDoS攻击检测与防御系统设计与实现》开题报告
目录 一、课题的研究目的和意义 1.1课题背景 1.2课题目的 (1)提高DDoS攻击检测的准确性 (2)加强DDoS攻击的防御能力 (3)提升网络安全防护的技术水平 1.3课题意义 (1)理论意义…...
面试之《前端常见的设计模式》
前端开发中运用多种设计模式可以提高代码的可维护性、可扩展性和可复用性。以下是一些常见的前端设计模式: 创建型模式 1. 单例模式 定义:确保一个类只有一个实例,并提供一个全局访问点。应用场景:在前端中,像全局状…...
Java volatile 关键字详解
Java volatile 关键字详解 1. volatile 的作用与原理 可见性保证: volatile 修饰的变量在修改后,会立即同步到主内存,其他线程读取时直接从主内存获取最新值,确保多线程环境下的可见性。例如: volatile boolean flag = false;当线程A修改flag为true后,线程B能立即感知到…...
【2025】基于springboot+vue的汽车销售试驾平台(源码、万字文档、图文修改、调试答疑)
基于 Spring Boot Vue 的汽车销售试驾平台通过整合前后端技术,实现了汽车销售和试驾预约的信息化和智能化。系统为管理员和用户提供了丰富的功能,提升了客户体验和销售效率,增强了数据分析能力,为汽车销售行业的发展提供了新的途…...
C语言每日一练——day_5
引言 针对初学者,每日练习几个题,快速上手C语言。第五天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
38.动态规划11
最长公共子序列 class Solution { public:int longestCommonSubsequence(string text1, string text2) {int n1text1.size();int n2text2.size();int res0;vector<int> dp(n2,0);for(int i0;i<n1;i){for(int jn2-1;j>0;j--){if(text2[j]text1[i]){for(int k0;k<…...
解析动态窗口法:机器人避障的智能 “导航仪”
在繁忙的智能仓库里,机器人正有条不紊地执行着搬运任务。这里货架林立,货物堆积如山,叉车往来穿梭,地面上还散落着一些临时放置的工具。一台小巧灵活的移动机器人,肩负着将特定货物从角落搬运至出货口的重任。只见它以稳定的速度朝着目标前进,突然,前方不远处一辆叉车急…...
【社区投稿】深入再谈智能指针、AsRef引用与Borrow借用
深入再谈智能指针、AsRef引用与Borrow借用 这是一个具有深度的技术主题。每次重温其理论知识,都会有新的领悟。大约 2 年前,我曾就这一技术方向撰写过另一篇短文《从类型转换视角,浅谈Deref<Target T>, AsRef<T>, Borrow<T&g…...
元组(Tuple)详解——c#
在C#中,元组(Tuple) 是一种轻量级的数据结构,用于将多个值组合成一个单一的对象。元组非常适合在不需要定义新类或结构体的情况下,临时存储和传递多个相关的值。 C# 中的元组有两种形式: 传统元组…...
串口通信函数汇总-ing
谢谢各位佬的阅读,本文是我自己的理解,如果您发现错误,麻烦请您指出,谢谢 首先谈谈我自己对于串口的理解,随便拿一个嵌入式的板子,它上面有两个引脚,一个是rx,一个是tx,r…...
01.Kubernetes 概述
Kubernetes 概述 Kubernetes 概述1. Kubernetes系统组件、集群及工作机制1.1 Kubernetes 集群的节点类型1.2 Kubernetes 集群架构1.2.1 API Server1.2.2 Cluster Store (etcd)1.2.3 Controller Manager1.2.4 Scheduler1.2.5 Kubelet1.2.6 Kube Proxy 1.3…...
十种处理权重矩阵的方法及数学公式
1. 权重归一化(Weight Normalization) 目的:通过分离权重向量的范数和方向来加速训练。公式:对于权重向量 w \mathbf{w} w,归一化后的权重 w ′ \mathbf{w} w′ 为: w ′ w ∥ w ∥ \mathbf{w} \frac{…...
JVM垃圾回收面试题及原理
1. 对象什么时候可以被垃圾器回收 如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收 如果要定位什么是垃圾,有两种方式来确定 引用计数法可达性分析算法 1.1 …...
Flutter 小技巧之通过 MediaQuery 优化 App 性能
许久没更新小技巧系列,温故知新,在两年半前的《 MediaQuery 和 build 优化你不知道的秘密》 我们聊过了在 Flutter 内 MediaQuery 对应 rebuild 机制,由于 MediaQuery 在 MaterialApp 内,并且还是一个 InheritedWidget ࿰…...
操作系统知识点23
1.实时操作系统的主要设计目标:在严格时间氛围内对外部请求做出反应。 2.当用户程序正在处理器上运行时,若此刻取到了一条特权指令,则处理器将停止执行该指令,并产生一个“非法操作”的事件 3.某网络监控系统中。多个被授权的用…...
【解决报错】:detected dubious ownership in repository at ‘D:/idea_code/xxx‘问题
解决报错:detected dubious ownership in repository at D:/idea_code/xxx‘问题 git config --global --add safe.directory *原因 这个错误提示表明 Git 检测到仓库的所有权存在问题,仓库的所有者与当前用户不匹配。Git 在 2.35.2 版本之后引入了一个…...
三角函数:从宇宙法则到AI革命的数学密钥
——跨越三千年的数学语言与现代科技全景透视 一、数学本质:宇宙的波动密码 1.1 拓扑学视角下的三角函数 三角函数本质是单位圆上点的坐标参数化,其数学表达可抽象为: { x cos θ ℜ ( e i θ ) y sin θ ℑ ( e i θ ) \begin…...
SpringBoot基础Kafka示例
这里将生产者和消费者放在一个应用中 使用的Boot3.4.3 引入Kafka依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency>yml配置 spring:application:name: kafka-1#kafka…...
Spring 的三种注入方式?
1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下。 1.1 属性注入 属性注入是大家最为常见也是使用最多的一种注入方式了,代码如下&#x…...
STM32第一天建立工程
新建一个工程 1:新建一个文件,添加文件 a:DOC工程说明 》doc说明文档 b:Libraries固件库 》cmsis内核文件 (一般这就是stm32内核文件) 》FWLIB外设文件 (这种就是stm32外设文件不全) 》start…...
记录一下返修
1.对复杂度的分析还不够; 2.融合两种指标的解释还不够,审稿人认为这两种指标存在冲突,不能同时优化,但其实我们考虑的是公平性保证整个调度周期内用户分配到了更加平均的sum-rate,而se是为了追求每个调度时刻都尽可能找到信道条件…...
搭建本地化笔记AI:用Copilot+deepseek+nomic-embed-text构建本地智能知识系统
安装Ollama https://ollama.com/ 下载模型 下载大语言模型 根据自己电脑的配置选择模型的大小 ollama run deepseek-r1:8b 下载向量处理模型 创建向量数据库时需要使用Embedding模型对文本进行向量化处理 ollama pull nomic-embed-text 查看安装的模型 ollama listNAME …...
【C语言】指针篇
目录 C 语言指针概述指针的声明和初始化声明指针初始化指针 指针的操作解引用操作指针算术运算 指针的用途动态内存分配作为函数参数 指针与数组数组名作为指针通过指针访问数组元素指针算术和数组数组作为函数参数指针数组和数组指针指针数组数组指针 函数指针函数指针的定义和…...
【蓝桥杯单片机】第十一届省赛
一、真题 二、创建工程 1.在C盘以外的盘新建文件夹,并在文件夹里面创建两个文件夹Driver 和Project 2.打开keil软件,在新建工程并选择刚刚建好的project文件夹,以准考证号命名 3.选择对应的芯片型号 4.选择否,即不创建启动文件 …...
【存储中间件】Neo4J图数据库超详细教程(一):相关介绍、特点及优势、数据模型、软件安装
文章目录 Neo4J超详细教程一、Neo4J相关介绍1.为什么需要图数据库方案1:Google方案2:Facebook 2.特点和优势3.什么是Neo4j4.Neo4j数据模型图论基础属性图模型Neo4j的构建元素 5.软件安装 个人主页:道友老李 欢迎加入社区:道友老李…...
xxl-job部署在docker-destop,实现定时发送预警信息给指定邮箱
XXL-JOB XXL-JOB是一个分布式任务调度平台(XXL是作者徐雪里姓名拼音的首字母),其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 源码仓库地址:https://github.com/xuxueli/xxl-job 源码结构: 系统架构 在xxl-j…...
【QT】QScrollBar设置样式:圆角、隐藏箭头、上边距等
目录 0.简介 1.原理 2.具体代码 0.简介 环境:Ubuntu22.04、qtDesigner绘制UI 项目需要,按照UI修改滚动条样式,滚动条我使用的是QScrollBar,默认样式和修改之后的样式如下: 1.原理 2.具体代码 我是用qtDesigner绘制…...
trae中文版AI搭建完整可用的项目框架
Trae 是由字节跳动推出的 AI 原生集成开发环境(AI IDE),号称可以搭建完整项目,个人试用后体验确实比Cursor或cline更便捷,因为他多个文件关联准确率更高。 正式版的trae不支持大陆使用,不过目前已经推出了…...
多数元素——面试经典150题(力扣)
题目 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3] 输出:3 …...
