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

贪心算法二

> 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:了解什么是贪心算法,并且掌握贪心算法。

> 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!

> 专栏选自:贪心算法_დ旧言~的博客-CSDN博客

> 望小伙伴们点赞👍收藏✨加关注哟💕💕

一、算法讲解

贪心算法的定义:

贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

解题的一般步骤是:

  1. 建立数学模型来描述问题;
  2. 把求解的问题分成若干个子问题;
  3. 对每一子问题求解,得到子问题的局部最优解;
  4. 把子问题的局部最优解合成原来问题的一个解。

如果大家比较了解动态规划,就会发现它们之间的相似之处。最优解问题大部分都可以拆分成一个个的子问题,把解空间的遍历视作对子问题树的遍历,则以某种形式对树整个的遍历一遍就可以求出最优解,大部分情况下这是不可行的。贪心算法和动态规划本质上是对子问题树的一种修剪,两种算法要求问题都具有的一个性质就是子问题最优性(组成最优解的每一个子问题的解,对于这个子问题本身肯定也是最优的)。

动态规划方法代表了这一类问题的一般解法,我们自底向上构造子问题的解,对每一个子树的根,求出下面每一个叶子的值,并且以其中的最优值作为自身的值,其它的值舍弃。而贪心算法是动态规划方法的一个特例,可以证明每一个子树的根的值不取决于下面叶子的值,而只取决于当前问题的状况。换句话说,不需要知道一个节点所有子树的情况,就可以求出这个节点的值。由于贪心算法的这个特性,它对解空间树的遍历不需要自底向上,而只需要自根开始,选择最优的路,一直走到底就可以了。

二、算法习题


2.1、第一题

题目链接:409. 最长回文串 - 力扣(LeetCode)

题目描述:

算法思路:⽤尽可能多的字符去构造回⽂串

  1. 如果字符出现偶数个,那么全部都可以⽤来构造回⽂串;
  2. 如果字符出现奇数个,减去⼀个之后,剩下的字符能够全部⽤来构造回⽂串;
  3. 最后再判断⼀下,如果有字符出现奇数个,就把它单独拿出来放在中间。

代码呈现:

class Solution {
public:int longestPalindrome(string s) {// 1. 计数 - ⽤数组模拟哈希表int hash[127] = {0};for (char ch : s)hash[ch]++;// 2. 统计结果int ret = 0;for (int x : hash) {ret += x / 2 * 2;}return ret < s.size() ? ret + 1 : ret;}
};

2.2、第二题

题目链接:942. 增减字符串匹配 - 力扣(LeetCode)

题目描述:

  

算法思路:

  • 当遇到 'I' 的时候,为了让下⼀个上升的数可选择的「范围更多」,当前选择「最⼩」的那个数;
  • 当遇到 'D' 的时候,为了让下⼀个下降的数可选择的「范围更多」,选择当前「最⼤」的那个数。

代码呈现:

class Solution {
public:vector<int> diStringMatch(string s) {int left = 0, right = s.size(); // ⽤ left,right 标记最⼩值和最⼤值vector<int> ret;for (auto ch : s) {if (ch == 'I')ret.push_back(left++);elseret.push_back(right--);}ret.push_back(left); // 把最后⼀个数放进去return ret;}
};

2.3、第三题

题目链接:455. 分发饼干 - 力扣(LeetCode)

题目描述:

  

算法思路:

先将两个数组排序。针对胃⼝较⼩的孩⼦,从⼩到⼤挑选饼⼲:

  1. 如果当前饼⼲能满⾜,直接喂(最⼩的饼⼲都能满⾜,不要浪费⼤饼⼲);
  2. 如果当前饼⼲不能满⾜,放弃这个饼⼲,去检测下⼀个饼⼲(这个饼⼲连最⼩胃⼝的孩⼦都⽆法满⾜,更别提那些胃⼝⼤的孩⼦了)。

代码呈现:

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {// 先排序sort(g.begin(), g.end());sort(s.begin(), s.end());// 利⽤双指针找答案int ret = 0, n = s.size();for (int i = 0, j = 0; i < g.size() && j < n; i++, j++) {while (j < n && s[j] < g[i])j++; // 找饼⼲if (j < n)ret++;}return ret;}
};

2.4、第四题

题目链接:553. 最优除法 - 力扣(LeetCode)

题目描述:

  

算法思路:

  • 在最终的结果中,前两个数的位置是⽆法改变的。
  • 因为每⼀个数的都是⼤于等于 2 的,为了让结果更⼤,我们应该尽可能的把剩下的数全都放在「分⼦」上。

代码呈现:

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 = to_string(nums[0]) + "/(" + to_string(nums[1]);for (int i = 2; i < n; i++) {ret += "/" + to_string(nums[i]);}ret += ")";return ret;}
};

2.4、第五题

题目链接:45. 跳跃游戏 II - 力扣(LeetCode)

题目描述:

  

算法思路:

  • ⽤类似层序遍历的过程,将第 i 次跳跃的「起始位置」和「结束位置」找出来,⽤这次跳跃的情况,更新出下⼀次跳跃的「起始位置」和「终⽌位置」。
  • 这样「循环往复」,就能更新出到达 n - 1 位置的最⼩跳跃步数。

代码呈现:

class Solution {
public:int jump(vector<int>& nums) {int left = 0, right = 0, maxPos = 0, ret = 0, n = nums.size();while (left <= right) // 保险的写法,以防跳不到 n - 1 的位置{if (maxPos >= n - 1) // 先判断⼀下是否已经能跳到最后⼀个位置{return ret;}// 遍历当成层,更新下⼀层的最右端点for (int i = left; i <= right; i++) {maxPos = max(maxPos, nums[i] + i);}left = right + 1;right = maxPos;ret++;}return -1; // 跳不到的情况}
};

2.6、第六题

题目链接:55. 跳跃游戏 - 力扣(LeetCode)

题目描述:

  

算法思路:

和 跳跃游戏II ⼀样,仅需修改⼀下返回值即可。

代码呈现:

class Solution {
public:bool canJump(vector<int>& nums) {int left = 0, right = 0, maxPos = 0, n = nums.size();while (left <= right) {if (maxPos >= n - 1) {return true;}for (int i = left; i <= right; i++) {maxPos = max(maxPos, nums[i] + i);}left = right + 1;right = maxPos;}return false;}
};

三、结束语 

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

相关文章:

贪心算法二

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…...

【大模型安全】大模型的技术风险

【大模型安全】大模型的技术风险 1.DDoS攻击2.常见的传统网络攻击方式3.恶意意图的识别4.AI生成虚假信息传播5.利用AI进行黑客攻击6.模型对抗攻击7.后门攻击8.Prompt攻击9.数据投毒攻击10.模型窃取攻击11.数据窃取攻击 1.DDoS攻击 2023年11月9日凌晨&#xff0c;OpenAI在官网公…...

Java 线程池中 shutdown 与 shutdownNow 的区别是什么?

Java 线程池中 shutdown 与 shutdownNow 的区别 核心行为差异 | 方法 | 行为描述 | |----------------|----------------------------------------------------------------------------| | shutdown | 平缓关闭线程池&#xff1a;1. 停止接受新任务。2. 已提交的任务&#xff…...

基于Spring Boot的共享学习经验系统的设计与实现

目录 摘 要 第1章 绪论 1.1研究背景与意义 1.2国内外现状 1.3研究目标 第2章 需求分析 2.1业务需求 2.1.1业务概述 2.1.2业务流程 2.2.1用例概述 2.2.2用例描述 2.3非功能性需求 第3章 系统设计 3.1技术路线 3.2系统功能模块设计 3.3系统架构 3.4数据库设计 3.4.1概念结构设…...

【简单的C++围棋游戏开发示例】

C围棋游戏开发简单示例&#xff08;控制台版&#xff09; ‌核心代码实现‌ #include <iostream> #include <vector> #include <queue> using namespace std;const int SIZE 9; // 简化棋盘为9x9‌:ml-citation{ref"1" data"citationList&…...

单片机中的基础外设GPIO的知识和应用—(6)

GPIO&#xff08;通用输入输出&#xff09;是单片机与外部世界交互的重要接口。单片机的GPIO引脚可以灵活配置为输入、输出、中断或复用功能&#xff0c;广泛应用于LED控制、按键读取、传感器通信等场景。下文以STM32F103C8T6的GPIO为例。有些51单片机IO功能有的稍微有不同&…...

10-Agent循环分析新闻并输出总结报告

目录 关键词 摘要 速览 自动新闻总结与行业分析报告生成流程 创建深度行业分析报告的工作流 测试用例执行与调试 业务逻辑与循环处理任务 演示如何在循环体中添加链接读取工具 使用大模型处理和分析新闻信息 构建循环分析新闻并生成综合报告的流程 分析和优化慢速循…...

十二、Redis Cluster(集群)详解:原理、搭建、数据分片与读写分离

Redis Cluster(集群)详解:原理、搭建、数据分片与读写分离 Redis Cluster 是 Redis 官方提供的分布式存储方案,通过数据分片(Sharding)实现 水平扩展(scalability),并提供 高可用性(HA) 和 故障自动转移(failover) 能力,解决了单机 Redis 内存受限、主从复制故障…...

贪心算法解题框架+经典反例分析,效率提升300%

贪心算法是一种在每一步选择中都采取当前状态下的最优决策&#xff0c;从而希望最终达到全局最优解的算法策略。以下从其定义、特点、一般步骤、应用场景及实例等方面进行讲解&#xff1a; 定义与基本思想 • 贪心算法在对问题求解时&#xff0c;总是做出在当前看来是最好的选…...

策略设计模式-下单

1、定义一个下单context类 通过这类来判断具体使用哪个实现类&#xff0c;可以通过一些枚举或者条件来判断 import com.alibaba.fastjson.JSON; import com.tc.common.exception.BusinessException; import com.tc.common.user.YjkUserDetails; import com.tc.institution.cons…...

Go加spy++隐藏窗口

最近发现有些软件的窗口就像狗皮膏药一样&#xff0c;关也关不掉&#xff0c;一点就要登录&#xff0c;属实是有点不爽了。 窗口的进程不能杀死&#xff0c;但是窗口我不想要。思路很简单&#xff0c;用 spy 找到要隐藏的窗口的句柄&#xff0c;然后调用 Windows 的 ShowWindo…...

React基础之tsx语法

tsx在jsx的基础上添加了新的类型&#xff0c;除此之外没有任何区别 事件绑定 function App() { const handleClick()>{ console.log(button被点击了); } return( <div className"App"> <button onClick{handleClick}>click me</button> </di…...

一体机:DeepSeek性能的“隐形枷锁”!

一体机是DeepSeek交付的最佳方式吗&#xff1f; 恰恰相反&#xff0c;一体机是阻碍DeepSeek提升推理性能的最大绊脚石。 为啥&#xff1f; 只因DeepSeek这个模型有点特殊&#xff0c;它是个高稀疏度的MoE模型。 MoE这种混合专家模型&#xff0c;设计的初衷是通过“激活一堆专…...

ALBEF的动量蒸馏(Momentum distillation)

简单记录学习~ 一、‌传统 ITC Loss 的局限性‌ ‌One-Hot Label 的缺陷‌ 传统对比学习依赖严格对齐的图文对&#xff0c;通过交叉熵损失&#xff08;如 softmax 归一化的相似度矩阵&#xff09;强制模型将匹配的图文对相似度拉高&#xff0c;非匹配对相似度压低‌11。但 one…...

浏览器WEB播放RTSP

注意&#xff1a;浏览器不能直接播放RTSP&#xff0c;必须转换后都能播放。这一点所有的播放都是如此。 参考 https://github.com/kyriesent/node-rtsp-stream GitHub - phoboslab/jsmpeg: MPEG1 Video Decoder in JavaScript 相关文件方便下载 https://download.csdn.net…...

将PDF转为Word的在线工具

参考视频&#xff1a;外文翻译 文章目录 一、迅捷PDF转换器二、Smallpdf 一、迅捷PDF转换器 二、Smallpdf...

03. 对象的创建,存储和访问原理

文章目录 01. 对象创建1.1 创建过程概览1.2 类加载检查1.3 为对象分配内存1.4 将内存空间初始化为零值1.5 设置对象的必要信息1.6 总结 02. 对象的内存布局2.1 对象头区域2.2 实例数据区域2.3 对齐填充区域2.4 总结 03. 对象的访问定位其他介绍01.关于我的博客 注&#xff1a;读…...

机器学习-GBDT算法

目录 一. GBDT 核心思想 二. GBDT 工作原理 ​**(1) 损失函数优化** ​**(2) 负梯度拟合** ​**(3) 模型更新** 三. GBDT 的关键步骤 四. GBDT 的核心优势 ​**(1) 高精度与鲁棒性** ​**(2) 处理缺失值** ​**(3) 特征重要性分析** ​五. GBDT 的缺点 ​**(1) 训练…...

redis基础结构

title: redis基础结构 date: 2025-03-04 08:39:12 tags: redis categories: redis笔记 Redis入门 &#xff08;NoSQL, Not Only SQL&#xff09; 非关系型数据库 关系型数据库&#xff1a;以 表格 的形式存在&#xff0c;以 行和列 的形式存取数据&#xff0c;一系列的行和列被…...

【keil】一种将STM32的armcc例程转换为armclang的方式

【keil】一种将所有armcc例程转换为armclang的方式 改的原因第一步下载最新arm6第二步编译成功 第三步去除一些warning编译成功 我这边用armclang去编译的话&#xff0c;主要是freertos中的portmacro.h和port.c会报错 改的原因 我真的服了&#xff0c;现在大部分的单片机例程都…...

计算机视觉算法实战——表面缺陷检测(表面缺陷检测)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 引言 表面缺陷检测是计算机视觉领域中的一个重要研究方向&#xff0c;旨在通过图像处理和机器学习技术自动检测产品表面的缺陷&…...

window下的docker内使用gpu

Windows 上使用 Docker GPU需要进行一系列的配置和步骤。这是因为 Docker 在 Windows 上的运行环境与 Linux 有所不同,需要借助 WSL 2(Windows Subsystem for Linux 2)和 NVIDIA Container Toolkit 来实现 GPU 的支持。以下是详细的流程: 一、环境准备 1.系统要求 Window…...

Modbus协议(TCP)

从今开始&#xff0c;会详细且陆续整理各类的通信协议&#xff0c;以便在需要且自身忘记的情况下&#xff0c;迅速复习。如有错误之处&#xff0c;还请批评指正。 一、Modbus协议的简述 Modbus协议作为应用层协议&#xff0c;基于主从设备模型&#xff0c;主设备负责请求消息&…...

虚拟系统配置实验报告

一、实验拓扑图 二、实验配置 要求一&#xff1a; 虚拟系统&#xff1a; 设置管理&#xff1a; 进行信息配置 R1配置 虚拟系统配置 a&#xff1a; b&#xff1a; c&#xff1a; 测试 a–>b&#xff1a; 检测...

Agentic系统:负载均衡与Redis缓存优化

摘要 本文在前文Agentic系统的基础上&#xff0c;新增负载均衡&#xff08;动态调整线程数以避免API限流&#xff09;和缓存机制&#xff08;使用Redis存储搜索结果&#xff0c;减少API调用&#xff09;。通过这些优化&#xff0c;系统在高并发场景下更加稳定高效。代码完整可…...

28-文本左右对齐

给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词&#xff1b;也就是说&#xff0c;尽可能多地往每行中放置单词。必要时可…...

建筑兔零基础自学python记录39|实战词云可视化项目——章节分布10(上)

这次我们来制作《红楼梦》各章节的分布情况&#xff1a; 源代码&#xff1a; import pandas as pd import numpy as np import matplotlib.pyplot as pltdf_hlm pd.read_csv("hlm.txt", names["hlm_texts"]).dropna()df_hlm df_hlm[~df_hlm.hlm_texts.s…...

Impacket工具中的横向渗透利器及其使用场景对比详解

在渗透测试中&#xff0c;横向移动&#xff08;Lateral Movement&#xff09;是指攻击者在获得一个系统的控制权限后&#xff0c;通过网络进一步渗透到其他系统的过程。Impacket 是一款强大的渗透测试工具集&#xff0c;提供了多种实现横向渗透的脚本&#xff0c;常见的工具包括…...

基于java,SpringBoot和Vue的医院药房药品管理系统设计

摘要 随着医疗行业信息化的快速发展&#xff0c;高效、精准的医院药房药品管理对于提升医疗服务质量和医院运营效率至关重要。本文基于 Java 语言&#xff0c;采用 SpringBoot 框架和 Vue 框架进行医院药房药品管理系统的设计与研究。该系统以 SpringBoot 作为后端开发框架&am…...

MQ保证消息的顺序性

在消息队列&#xff08;MQ&#xff09;中保证消息的顺序性是一个常见的需求&#xff0c;尤其是在需要严格按顺序处理业务逻辑的场景&#xff08;例如&#xff1a;订单创建 → 支付 → 发货&#xff09;。 一、消息顺序性被破坏的原因 生产者异步/并行发送&#xff1a;消息可能…...