【贪心算法】day1

【贪心算法】day1

📝前言说明:

  • 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话);(4)这个贪心算法正确性的证明
  • 文章中的理解仅为个人理解。如有错误,感谢纠错
🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础python入门基础C++学习笔记Linux
🎀ZEEKLOG主页 愚润泽

你可以点击下方链接,进行其他贪心算法题目的学习

点击链接开始学习
贪心day1贪心day2
贪心day3贪心day4
贪心day5贪心day6
贪心day7贪心day8
贪心day9贪心day10

也可以点击下面连接,学习其他算法

点击链接开始学习
优选专题动态规划
递归、搜索与回溯贪心算法

题单获取【贪心算法】题单汇总

题目


贪心算法导论

贪心策略的核心思想:局部最优 当做 全局最优

  1. 把解决问题的过程分为若干步
  2. 解决每一步时,都选择当前看起来 “最优的” 解法
  3. “希望” 这个局部最优是全局最优

贪心算法的特点:

  1. 根据 “贪心策略” 得到的结果可能是错误的
  2. 正确的 “贪心策略” 需要证明 “正确性”
  3. 不同题目的贪心策略不同,把我们遇到的贪心策略当 “经验” 来看就好

860. 柠檬水找零

题目链接:https://leetcode.cn/problems/lemonade-change/description/

在这里插入图片描述

优质解

思路:

  • 问题分析(一杯柠檬水5元):找零问题可以分情况讨论
    • 5 元 → 不用找,直接收下
    • 10 元 → 收下,且找 5
    • 20 元 → 收下,找10 + 5 or 5 * 3
  • 前两种情况是固定找法,只有20的时候有选择,此时最优解是:优先找10 + 5(这就是本题的贪心策略)

代码:

classSolution{public:boollemonadeChange(vector<int>& bills){int arr[2];// 用来存放 5, 10 元的数量memset(arr,0,sizeof(arr));for(auto b: bills){if(b ==5) arr[0]++;elseif(b ==10){ arr[1]++; arr[0]--;}else{if(arr[1]>0)// 有 10 块的优先找10块的{ arr[1]--; arr[0]--;}else arr[0]-=3;}if(arr[0]<0)returnfalse;}returntrue;}};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

证明

利用:交换论证法
原理:在不破坏最优解的 “最优性质” 的前提下,将最优解调整成贪心解,则代表这个贪心解是正确的

在这个问题中:只有遇到 20 元的时候才需要考虑策略:

  • 贪心策略:有 10 就优先 10 + 5
  • 最优策略:每次找20:可能 10 + 55 + 5 + 5(未知的)

最优策略中:当选择 5 + 5 + 5 的时候,如果有多的10块钱,此时可以用10替换一个 5 + 5,(此时,最优解依然是最优解,即:依然可以保证能够找零成功,所以这个最优解可以调整为贪心解)


2208. 将数组和减半的最少操作次数

题目链接:https://leetcode.cn/problems/minimum-operations-to-halve-array-sum/description/

在这里插入图片描述

个人解

思路:

  • 每次选最大的来减小一半
  • 意味着要排序,可以利用大根堆

屎山代码:

classSolution{public:inthalveArray(vector<int>& nums){ priority_queue<double> arr;double sum =0;for(auto x: nums){ sum += x; arr.push(x);}double cur = sum;int count =0;while(cur > sum /2){ count++;double max = arr.top(); arr.pop(); cur -= max /2; arr.push(max /2);}return count;}};

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( n ) O(n) O(n)

证明

依旧是:交换论证法

  • 某次选择中,若:最优解中选择的数 x < 贪心中的 y
  • 易知,此x可用y替换

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

Read more

Spring Boot 4使用Opentelemetry OTLP协议快速集成Jaeger + Prometheus + loki 实现指标监控,链路追踪,日志聚合

Spring Boot 4使用Opentelemetry OTLP协议快速集成Jaeger + Prometheus + loki 实现指标监控,链路追踪,日志聚合

效果图: 描述 在现代云原生架构中,可观测性不再是可选项,而是一项基本要求。你需要通过指标了解应用程序的运行情况,通过跟踪了解请求的流向,并通过日志了解应用程序的运行状态。 什么是Opentelemetry 官方:https://opentelemetry.io OpenTelemetry(简称 OTel) 是一个开源的、厂商中立的 可观测性(Observability)框架和工具集,旨在统一和标准化应用程序的 指标(Metrics)、日志(Logs)和分布式追踪(Traces) 的生成、收集、处理与导出。 它由 Cloud Native Computing Foundation(CNCF) 托管,是目前云原生生态中最主流、最推荐的可观测性标准,被广泛用于微服务、Kubernetes、Serverless 等现代架构中。 为什么使用Jaeger,Prometheus,Loki Jaeger官方描述与安装:https://www.

By Ne0inhk
分布式 vs 微服务:别再傻傻分不清了

分布式 vs 微服务:别再傻傻分不清了

分布式 vs 微服务:别再傻傻分不清了 🤔 * 引言:一对容易混淆的"双胞胎" * 一、核心定义:完全不同的维度 📚 * 1.1 什么是分布式系统? * 1.2 什么是微服务? * 二、核心区别:目标 vs 形态 🎯 * 2.1 对比表 * 2.2 用一个例子说清楚 * 2.3 代码层面的区别 * 三、分布式系统的常见形态 🏗️ * 3.1 分布式计算 * 3.2 分布式存储 * 3.3 分布式缓存 * 3.4 微服务架构 * 四、两者关系:维恩图 📊 * 五、

By Ne0inhk
SpringBoot + LangChain4j 打造企业级 RAG 智能知识库,多工具集成方案

SpringBoot + LangChain4j 打造企业级 RAG 智能知识库,多工具集成方案

基于 Spring Boot 4 + LangChain4j 1.11 + Ollama + Qdrant +MCP 的一体化 多Agentic 智能体,RAG 系统 本文结合笔者企业级项目,重新抽象,开发,一个真正“开箱即用”的企业级智能知识库系统。它不仅支持标准 RAG 问答,更融合了 Agentic 智能体架构、MCP 文件沙盒、金融专用算子 和 混合模型路由,提供从文档上传到复杂推理的完整闭环体验。 1. 总览:技术栈与核心能力 ✨ 维度技术选型能力说明后端框架Spring Boot 4 + SQLite轻量级持久化,无需额外数据库,生产可切换为其他数据,如mysql,pgsqlAI 引擎LangChain4j 1.11支持 Agentic 工具调用、流式响应、

By Ne0inhk

【GitHub项目推荐--ZeroClaw:零开销、零妥协的Rust原生AI助手基础设施】⭐⭐⭐

简介 ZeroClaw 是一个由ZeroClaw Labs开发的开源、快速、小型且完全自主的AI助手基础设施框架,采用100% Rust编写,秉持“零开销、零妥协”的设计哲学。该项目以其惊人的资源效率著称——能够在仅10美元的硬件上运行,内存占用低于5MB,启动时间短于10毫秒,相比同类解决方案(如OpenClaw)减少99%的内存使用和98%的部署成本。ZeroClaw不仅是一个高性能的AI助手运行时,更是一个完全可插拔的架构,允许开发者“在任何地方部署,交换任何组件”。 核心价值: * 极致效率:3.4MB的独立二进制文件,<5MB内存占用,<10ms启动时间 * 成本革命:专为边缘设备和资源受限环境设计,大幅降低AI助手部署门槛 * 完全自主:内置自治引擎,支持从监督到完全自主的不同运行模式 * 架构灵活:基于trait的模块化设计,所有核心子系统均可热插拔替换 技术定位:ZeroClaw填补了高性能AI助手框架与资源受限环境之间的空白。它既不是另一个“重型”AI平台,也不是简单的脚本工具,而是一个经过精心设计、

By Ne0inhk