贪心算法part01

ops/2024/12/29 2:48:33/

文章参考来源代码随想录

算法>贪心算法:局部最优到全局最优

455.分发饼干

这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩

可以尝试使用贪心策略,先将饼干数组和小孩数组排序

然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.begin(),s.end());int result=0;int index=s.size()-1;for(int i=g.size()-1;i>=0;i--){if(index>=0&&s[index]>=g[i]){result++;index--;}}return result;}
};

用了一个 index 来控制饼干数组的遍历(以此标记取过的饼干),遍历饼干并没有再起一个 for 循环,而是采用自减的方式,这也是常用的技巧。 

376. 摆动序列

局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。其实这里不用删除,只需要记录个数就行了。

整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。

前峰值,当前峰值;

峰值时计数器+1。

情况一:上下坡中有平坡

这里规定删除左边的节点,因此判断峰值条件就变为(prediff>=0&&curdiff<0)||(prediff<=0&&curdiff>0)

那么 当 prediff = 0 && curdiff < 0 也要记录一个峰值,因为他是把之前相同的元素都删掉留下的峰值。

情况二:数组首尾两端

题目中说了,如果只有两个不同的元素,那摆动序列也是 2。

因为我们在计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i])的时候,至少需要三个数字才能计算,而数组只有两个数字。

这里我们可以写死,就是 如果只有两个元素,且元素不同,那么结果为 2。

之前我们在 讨论 情况一:相同数字连续 的时候, prediff = 0 ,curdiff < 0 或者 >0 也记为波谷。

那么为了规则统一,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0,如图:

376.摆动序列1

针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)

情况三:单调坡度有平坡

 我们只需要在 这个坡度 摆动变化的时候,更新 prediff 就行,这样 prediff 在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。就是把prediff=curdiff;提到if中。

53. 最大子序和

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

全局最优:选取最大“连续和”。

count记为连续和,结果为result。

当结果小于连续和时,后者赋给前者;(本质是不断确定区间结束位置)

当连续和为负时,重置连续和;(本质是不断确定区间开始位置)

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


http://www.ppmy.cn/ops/139587.html

相关文章

Spring Boot+Netty

因工作中需要给第三方屏幕厂家下发广告&#xff0c;音频&#xff0c;图片等内容&#xff0c;对方提供TCP接口于是我使用Netty长链接进行数据传输 1.添加依赖 <!-- netty依赖--><dependency><groupId>io.netty</groupId><artifactId>netty-all&…

EasyAnimateV5 视频生成大模型原理详解与模型使用

在数字内容创作中&#xff0c;视频扮演的角色日益重要。然而&#xff0c;创作高质量视频通常耗时且昂贵。EasyAnimate 系列旨在利用人工智能技术简化这一过程。EasyAnimateV5 建立在其前代版本的基础之上&#xff0c;不仅在质量上有所提升&#xff0c;还在多模态数据处理和跨语…

【附源码】基于环信鸿蒙IM SDK实现一个聊天Demo

项目背景 本项目基于环信IM 鸿蒙SDK 打造的鸿蒙IM Demo&#xff0c;完全适配HarmonyOS NEXT系统&#xff0c;实现了发送消息&#xff0c;添加好友等基础功能。代码开源&#xff0c;功能简洁&#xff0c;如果您有类似开发需求可以参考。 源码地址&#xff1a;https://github.c…

Word2vec、词向量是什么? |Gensim中word2vec模型的参数定义

前言&#xff1a; 最近在忙毕设&#xff0c;要学习一些AI的技术。很多资料看来看去&#xff0c;感觉只是在大脑皮层表面略过了一下&#xff0c;遂还是决定采用老方法&#xff0c;写博客&#xff01;&#xff01;&#xff01;对了&#xff0c;我也只是一个萌新&#xff0c;博客的…

网络原理之 UDP 协议

目录 1. UDP 协议报文格式 2. UDP 的特点 (1) 无连接 (2) 不可靠 (3) 面向数据报 (4) 全双工 3. 基于 UDP 的应用层协议 前文是&#xff1a;UDP 的使用 首先了解一下基础知识&#xff1a; 1. UDP 协议报文格式 传输层最重要的协议有两个&#xff0c;一个是 TCP&#x…

vscode通过ssh连接虚拟机进行开发

虚拟机自带的vscode很卡而且画质感觉不行&#xff0c;所以用这种方法解决 1.VSCODE安装扩展Tabnine(AI代码补全)&#xff0c;Remote Development 2.虚拟机终端ifconfig查看本机ip 192.168.43.197 开启ubuntu的SSH服务 sudo apt-get install openssh-server 配置vscode的ssh …

登Nature子刊!华中师范大学提出DigFrag,用AI精准分割分子片段,并生成44个药物/农药分子

过去几十年&#xff0c;基于片段的药物发现 (FBDD) 通过识别与靶标蛋白有微弱相互作用的小分子片段&#xff0c;并优化这些片段的结构信息&#xff0c;可以开发出活性更高的先导化合物&#xff0c;在新药研发中发挥了重要作用。 尽管 FBDD 在药物发现和开发领域扮演着关键角色…

springai结合ollama

目录 ollama 介绍 使用 下载&#xff1a; 安装&#xff1a; 点击这个玩意next就行了。 运行 spring ai使用ollama调用本地部署的大模型 加依赖 配置yml 写代码 ollama 介绍 官网&#xff1a;Ollama Ollama是一个用于部署和运行各种开源大模型的工具&#xff1b; …