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

LeetCode刷题笔记【23】:贪心算法专题-1(分发饼干、摆动序列、最大子序和)

文章目录

  • 前置知识
    • 贪心算法的本质
    • 什么时候用贪心算法?
    • 什么时候不能用贪心?
    • 贪心算法的解题步骤
  • 455.分发饼干
    • 题目描述
    • 解题思路
    • 代码
  • 376. 摆动序列
    • 题目描述
    • 解题思路
    • 代码
  • 53. 最大子序和
    • 题目描述
    • 暴力解法
    • 动态规划
    • 贪心算法
  • 总结

前置知识

贪心算法的本质

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。

例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?
指定每次拿最大的,最终结果就是拿走最大数额的钱。
每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。

什么时候用贪心算法?

  1. 感觉像是可以用贪心
  2. 用题中的案例试一下, 发现没问题
  3. 尝试举一下反例, 发现没问题
  4. 那就可以用了

所以贪心算法并没有固定的规律和套路, 也不会要求你论证背后算法的合理性和有效性, 只要能解决问题, 通过测试案例即可.

ps:个人认为贪心非常虚无缥缈呀, 还是动态规划更加有迹可循;
并且在实践过程中, 可以用贪心算法的, 基本都可以用动态规划.

什么时候不能用贪心?

当局部最优, 不一定可以达到全局最优的时候, 如:

有一堆盒子,你有一个背包体积为n,如何把背包尽可能装;
如果还每次选最大的盒子,就不行了。
这时候就需要动态规划。

贪心算法的解题步骤

  1. 将问题分解为若干个子问题
  2. 找出适合的贪心策略
  3. 求解每一个子问题的最优解
  4. 将局部最优解堆叠成全局最优解

这样的叙述非常抽象, 实践过程中还是要把握思想: 选择每一阶段的局部最优,从而达到全局最优

参考文章:关于贪心算法, 你该了解这些

455.分发饼干

题目描述

截图

LeetCode链接:https://leetcode.cn/problems/assign-cookies/description/

解题思路

思路: 先将两个数组都srot
遍历g数组, 优先满足胃口最小的孩子
遍历g数组中的元素gg的时候, 依次遍历s数组, 选择能满足gg的最小尺寸饼干

代码

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {int ans=0;sort(g.begin(), g.end());sort(s.begin(), s.end());int ss=0;for(int gg : g){for(; ss<s.size(); ++ss){if(s[ss] >= gg){s[ss] = 0;ans++;break;}}}return ans;}
};

376. 摆动序列

题目描述

在这里插入图片描述

LeetCode链接:https://leetcode.cn/problems/wiggle-subsequence/description/

解题思路

<代>: 其实过程中不需要对数组进行操作, 只需要看有多少个点是符合要求的即可;
具体过程比较复杂, 建议参考其原文.

代码

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int n=nums.size();if(n==0 || n==1 || (n==2 && nums[0]!=nums[1]))return n;int curDiff = 0;int preDiff = 0;int ans=1;for(int i=0; i<n-1; ++i){curDiff = nums[i+1] - nums[i];if((preDiff<=0 && curDiff>0) || (preDiff>=0 && curDiff<0)){ans++;preDiff = curDiff;}}return ans;}
};

53. 最大子序和

题目描述

截图

LeetCode链接:https://leetcode.cn/problems/maximum-subarray/description/

暴力解法

思路: 暴力解法
对数组中每个数, 都依次向后遍历所有子数组, 求和, 和ansmax

class Solution {
public:int maxSubArray(vector<int>& nums) {int ans=INT_MIN;for(int i=0; i<nums.size(); ++i){int sum=0;for(int j=i; j<nums.size(); ++j){sum += nums[j];ans = max(ans, sum);}}return ans;}
};

动态规划

不出所料的, 超出时间限制;
用动态规划, 创建数组maxSum
nums[0]maxSum[0]就是自己本身
之后的nums[i]maxSum[i]=max(nums[i], maxSum[i-1]+nums[i])

class Solution {
public:int maxSubArray(vector<int>& nums) {if(nums.size()==1)return nums[0];vector<int> maxSum(nums.size());maxSum[0] = nums[0];int ans=nums[0];for(int i=1; i<nums.size(); ++i){maxSum[i] = max(nums[i], maxSum[i-1]+nums[i]);ans = max(ans, maxSum[i]);}return ans;}
};

优化: 不用数组用pre

class Solution {
public:int maxSubArray(vector<int>& nums) {int ans = nums[0];int pre = nums[0];for(int i=1; i<nums.size(); ++i){pre = max(pre+nums[i], nums[i]);ans = max(ans, pre);}return ans;}
};

贪心算法

在这里插入图片描述
选取一个个"区间", 过程中用count记录区间内的和;
count<0时, 将其清空(=0)

class Solution {
public:int maxSubArray(vector<int>& nums) {int ans = INT_MIN;int count=0;for(int i=0; i<nums.size(); ++i){count += nums[i];ans = max(ans, count);if(count<0)count = 0;}return ans;}
};

总结

相比于动态规划, 贪心算法的思路难把握的多, 也很难以揣摩;
所以过程中如果想不出来, 第一反应应该是尝试动态规划, 或者直接看题解;

一方面不要在做题过程中硬磕贪心算法;
另一方面在学习的时候, 不要过于较真, 对于贪心这一部分的内容, 可以适当抱着"了解"和:"探索学习"的心态.
把精力多花在可以比较快比较好地掌握和把握的部分和方法上.

本文参考:
分发饼干
摆动序列
最大子序和

相关文章:

LeetCode刷题笔记【23】:贪心算法专题-1(分发饼干、摆动序列、最大子序和)

文章目录 前置知识贪心算法的本质什么时候用贪心算法?什么时候不能用贪心?贪心算法的解题步骤 455.分发饼干题目描述解题思路代码 376. 摆动序列题目描述解题思路代码 53. 最大子序和题目描述暴力解法动态规划贪心算法 总结 前置知识 贪心算法的本质 贪心的本质是选择每一阶…...

C++算法 —— 分治(2)归并

文章目录 1、排序数组2、数组中的逆序对3、计算右侧小于当前元素的个数4、翻转对 本篇前提条件是已学会归并排序 1、排序数组 912. 排序数组 排序数组也可以用归并排序来做。 vector<int> tmp;//写成全局是因为如果在每一次小的排序中都创建一次&#xff0c;更消耗时间和…...

Hadoop YARN HA 集群安装部署详细图文教程

目录 一、YARN 集群角色、部署规划 1.1 集群角色--概述 1.2 集群角色--ResourceManager&#xff08;RM&#xff09; 1.3 集群角色--NodeManager&#xff08;NM&#xff09; 1.4 HA 集群部署规划 二、YARN RM 重启机制 2.1 概述 2.2 演示 2.2.1 不开启 RM 重启机制…...

BBS+商城项目的数据库表设计

本文章是对于BBS商城项目的数据库的初步设计&#xff0c;仅供参考&#xff01; -- 创建用户表 CREATE TABLE Users (id bigint(20) PRIMARY KEY COMMENT 用户ID,username varchar(255) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,status int(1) DE…...

如何使用Savitzky-Golay滤波器进行轨迹平滑

一、Savitzky-Golay滤波器介绍 Savitzky-Golay滤波器是一种数字滤波器&#xff0c;用于平滑数据&#xff0c;特别是在信号处理中。它基于最小二乘法的思想&#xff0c;通过拟合数据到一个滑动窗口内的低阶多项式来实现平滑。这种滤波器的优点是它可以保留数据的高频信息&#…...

Nomad系列-Nomad网络模式

系列文章 Nomad 系列文章 概述 Nomad 的网络和 Docker 的也有很大不同, 和 K8s 的有很大不同. 另外, Nomad 不同版本(Nomad 1.3 版本前后)或是否集成 Consul 及 CNI 等不同组件也会导致网络模式各不相同. 本文详细梳理一下 Nomad 的主要几种网络模式 在Nomad 1.3发布之前&a…...

OpenCV项目开发实战--实现面部情绪识别对情绪进行识别和分类及详细讲解及完整代码实现

文末提供免费的完整代码下载链接 面部情绪识别(FER)是指根据面部表情对人类情绪进行识别和分类的过程。通过分析面部特征和模式,机器可以对一个人的情绪状态做出有根据的猜测。面部识别的这个子领域是高度跨学科的,借鉴了计算机视觉、机器学习和心理学的见解。 在这篇研究…...

Validate表单组件的封装

之前一直是直接去使用别人现成的组件库&#xff0c;也没有具体去了解人家的组件是怎么封装的&#xff0c;造轮子才会更好地提高自己&#xff0c;所以尝试开始从封装Form表单组件开始 一&#xff1a;组件需求分析 本次封装组件&#xff0c;主要是摸索封装组件的流程&#xff0c;…...

企业架构LNMP学习笔记32

企业架构LB-服务器的负载均衡之LVS实现&#xff1a; 学习目标和内容 1&#xff09;能够了解LVS的工作方式&#xff1b; 2&#xff09;能够安装和配置LVS负载均衡&#xff1b; 3&#xff09;能够了解LVS-NAT的配置方式&#xff1b; 4&#xff09;能够了解LVS-DR的配置方式&…...

基于Jetty9的Geoserver配置https证书

1.环境准备 由于Geoserver自带的jetty版本不具备https模块&#xff0c;所以需要下载完整版本jetty。这里需要先查看本地geoserver对应的jetty版本&#xff0c;进入geoserver安装目录&#xff0c;执行如下命令。 java -jar start.jar --version Jetty Server Classpath: -----…...

企业互联网暴露面未知资产梳理

一、互联网暴露面梳理的重要性 当前&#xff0c;互联网新技术的产生推动着各种网络应用的蓬勃发展&#xff0c;网络安全威胁逐渐蔓延到各种新兴场景中&#xff0c;揭示着网络安全威胁不断加速泛化。当前网络存在着许多资产&#xff0c;这些资产关系到企业内部的安全情况&#…...

【动态规划刷题 12】等差数列划分 最长湍流子数组

139. 单词拆分 链接: 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: …...

react-redux 的使用

react-redux React Redux 是 Redux 的官方 React UI 绑定库。它使得你的 React 组件能够从 Redux store 中读取到数据&#xff0c;并且你可以通过dispatch actions去更新 store 中的 state 安装 npm install --save react-reduxProvider React Redux 包含一个 <Provider…...

77 # koa 中间件的应用

调用 next() 表示执行下一个中间件 const Koa require("koa");const app new Koa();app.use(async (ctx, next) > {console.log(1);next();console.log(2); });app.use(async (ctx, next) > {console.log(3);next();console.log(4); });app.use(async (ctx,…...

【css】z-index与层叠上下文

z-index属性用来设置元素的堆叠顺序&#xff0c;使用z-index有一个大的前提&#xff1a;z-index所作用元素的样式列表中必须有position属性并且属性值为absolute、relative或fixed中的一个&#xff0c;否则z-index无效。 层叠上下文 MDN讲解 我们给元素设置的z-index都是有一…...

系统架构设计师(第二版)学习笔记----多媒体技术

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----多媒体技术 文章目录 一、多媒体概述1.1 媒体的分类1.2 多媒体的特征1.3 多媒体系统的基本组成 二、多媒体系统的关键技术2.1 多媒体系统的关键技术2.2 视频技术的内容2.3 音频技术的内容2.4 数据压缩算法…...

【面试经典150 | 数组】合并两个有序数组

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;合并排序方法二&#xff1a;双指针方法三&#xff1a;原地操作-从前往后方法四&#xff1a;原地操作-从后往前 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章…...

系统架构设计专业技能 ·操作系统

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 操作系统 一、操作系统概述二、进程管理2.1 进程概念2.2 进…...

CSP 202209-1 如此编码

答题 题目就是字多 #include<iostream>using namespace std;int main() {int n,m;cin>>n>>m;int a[n],c[n1];c[0]1;for(int i0;i<n;i){cin>>a[i];c[i1]c[i]*a[i];}for(int i0;i<n;i){cout<<(m%c[i1]-m%c[i])/c[i]<< ;} }...

windows安装向量数据库milvus

本文介绍windows下安装milvus的方法。 一.Docker安装 1.1docker下载 首先到Docker官网上下载docker:Docker中文网 官网 1.2.安装前前期准备 先使用管理员权限打开windows powershell 然后在powershell里面输入下面那命令&#xff0c;启用“适用于 Linux 的 Windows 子系统”…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...