贪心算法:理论基础 分发饼干 摆动序列 最大子序和

理论基础 

  • 什么是贪心算法?
    • 贪心的本质是选择每一阶段的局部最优,从而达到全局最优
  • 什么时候用贪心算法?
    • 贪心算法并没有固定的套路。唯一的难点就是如何通过局部最优,推出整体最优。
  • 如何验证可不可以用贪心算法?
    • 最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧
  • 贪心算法一般解题步骤(比较理论化,实用性不强)
    • 将问题分解为若干个子问题
    • 找出适合的贪心策略
    • 求解每一个子问题的最优解
    • 将局部最优解堆叠成全局最优解


455.分发饼干

  • 思路:
    • 如果用最大的饼干来喂胃口最小的孩子,势必会造成饼干尺寸的浪费。所以为了满足更多的小孩,思路应该是尽量用大的饼干来满足胃口大的孩子从后向前遍历小孩数组,尺寸大的饼干优先满足胃口大的孩子,并统计满足小孩数量(或小饼干先喂饱小胃口)。
    • 局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩
  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(1)
class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int count = 0;int index = s.size() - 1;//遍历饼干时的下标for(int i = g.size() - 1; i >= 0; i--) {//遍历孩子的胃口if(index >= 0 && s[index] >= g[i]) {//遍历饼干count++;index--;}}return count;}
};


376. 摆动序列

  • 思路:
    • 大体思路:让峰值尽可能的保持峰值,然后删除单一坡度上的节点
      • 局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值
      • 整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列
    • 考虑三种情况(prediff:与前一个数的差,curdiff:与后一个数的差):
      • 情况一:上下坡中有平坡
        • 数组[1,2,2,2,2,1]的摇摆序列长度为3,也就是[1,2,1],那么应该取哪一个2呢?不妨统一规则,保留最后一个
        • 当遍历到第一个2时,prediff > 0 && curdiff = 0;当遍历到最后一个2时,prediff = 0 && curdiff < 0,此时要记录一个峰值。
      • 情况二:数组首尾两端
        • ​​​​​​​数组[2,5],在计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i])的时候,至少需要三个数字才能计算,而只有两个不同数字的无法这样计算,但显然摇摆序列长度为2。
        • 如果不只有两个元素,我们在判断首尾元素时依旧无法使用上述方法。不妨假设数组最前面还有一个数字,与第一个数字相同,此时prediff = 0,就可以用情况一来判断。而默认最后有一个峰值(统计变量初始化为1)。
      • 情况三:单调坡中有平坡
        • ​​​​​​​数组[1,2,2,2,3,4],根据情况一,遍历到最后一个2时,prediff = 0,curdiff > 0,会记录一个峰值,这样计算出结果会是3,但实际上摇摆序列长度应该为2。
        • 出错的原因是因为实时更新了 prediff,只需要在 这个坡度 摆动变化的时候,更新 prediff 就行,这样 prediff 在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
class Solution {
public:int wiggleMaxLength(vector<int>& nums) {if(nums.size() <= 1) return nums.size();int res = 1;//默认最后一个元素为一个峰值,记录峰值个数int prediff = 0;//与前一元素的差int curdiff = 0;//与后一元素的差for(int i = 0; i < nums.size() - 1; i++) {//因为默认最后一个为峰值,所以i < nums.size() - 1curdiff = nums[i + 1] - nums[i];//出现峰值if((prediff <= 0 && curdiff > 0) || (prediff >= 0 && curdiff < 0)) {res++;prediff = curdiff;//只在统计到峰值的时候更新prediff}}return res;}
};


53. 最大子序和 

  • 思路:
    • 如果前面的和为负数,不管什么数加上负数,总和肯定会变小,因此使用贪心算法时,会直接舍弃前面和为负数的这段,直接从下一个元素开始重新计算连续子序列和
    • 全局最优:选取最大“连续和”
    • 局部最优的情况下,并记录最大的“连续和”,可以推出全局最优
    • 本质上就是不断调整子序列区间求和,区间的终止位置,就是如果当前总和取到最大值时,及时用result变量记录下来。
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
class Solution {
public:int maxSubArray(vector<int>& nums) {int res = INT_MIN;int sum = 0;for(int i = 0; i < nums.size(); i++) {sum += nums[i];//取区间累计的最大值(相当于不断确定最大子序终止位置)res = sum > res ? sum : res;if(sum <= 0) sum = 0;//重置最大子序起始位置,因为遇到负数一定是拉低总和}return res;}
};


总结

最好举反例,举不出反例时就可以考虑使用贪心算法

参考链接

代码随想录:理论基础  分发饼干  摆动序列  最大子序和

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/267592.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyV易知微数字孪生助力解决实际行业问题与痛点

数字孪生技术在当前多个领域得到了广泛的应用&#xff0c;特别是在航空航天、工业、城市和医学等领域&#xff0c;它被视为许多科技企业所关注的焦点。这种技术已经成为实现智能化的重要手段&#xff0c;它可以应用于项目设计、建造和运营等各个阶段&#xff0c;能够解决实际问…

vue-如何实现带参数跳转页面

文/朱季谦 在vue框架的前端页面上&#xff0c;若要实现页面之间的带参数跳转&#xff0c;可参考以下实现过程&#xff1a; 例如&#xff0c;点击截图中的“查看试卷”&#xff0c;可实现带参跳转到相应的试卷页面&#xff0c;该功能类似查看试卷的详情页面&#xff1a; 假如以…

C++类与对象(一)

目录 一&#xff0c;面向过程和面向对象初步认识 二&#xff0c;类的引入 三&#xff0c;类的定义 四&#xff0c;类的访问限定符及封装 五&#xff0c;类的实例化 六&#xff0c;类对象模型 七&#xff0c;this指针 一&#xff0c;面向过程和面向对象初步认识 c语言是面…

高通SDX12:nand flash适配

一、SBL阶段 代码流程如下: boot_images\core\storage\flash\src\dal\flash_nand_init.c nand_probe ->nand_intialize_primary_hal_device ->>nand_get_device_list_supportedboot_images\core\storage\flash\src\dal\flash_nand_config.c ->>>flash_n…

饮料行业供应链主数据解决方案

引用GB/T10789-2015《饮料通则》中定义&#xff0c;饮料共11大类。饮料企业中&#xff0c;有的会包含所有的分类&#xff0c;有的会涉及其中的一类或几个分类。 但&#xff0c;不同的饮料企业在运营管理方式和经营的重点&#xff0c;延伸到企业主数据管理的重点和策略都是有所不…

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】MobileNets_V3模型算法详解

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】MobileNets_V3模型算法详解 文章目录 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】MobileNets_V3模型算法详解前言MobleNet_V3讲解SE模块(Squeeze Excitation)重新设计激活函数反向残差结构(Inverted Residua…

屏幕分辨率修改工具SwitchResX mac功能特点

SwitchResX mac是可用于修改和管理显示器的分辨率和刷新率。 SwitchResX mac功能和特点 支持多种分辨率和刷新率&#xff1a;SwitchResX可以添加和管理多种分辨率和刷新率&#xff0c;包括自定义分辨率和刷新率。 自动切换分辨率&#xff1a;SwitchResX可以根据应用程序和窗口…

使用shell脚本将一台虚拟机上面数据分发到其他虚拟机上面xsync

目录 1&#xff0c;功能2&#xff0c;注意点3&#xff0c;shell脚本介绍4&#xff0c;bash内容 1&#xff0c;功能 使用shell脚本将一台虚拟机上面数据分发到其他虚拟机上面。 2&#xff0c;注意点 需要修改的地方&#xff1a;hadoop250 hadoop251 hadoop252 hadoop253 hado…

QT 入门

目录 QT 概述 QT5安装 QT环境介绍 编写第一个QT的程序 QT项目文件介绍 QT 概述 QT简介 QT是一个跨平台的C图形用户界面应用程序框架。它为程序开发者提供图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正地组件编程。 QT的发…

HTML面试题---专题三

文章目录 一、前言二、如何使用 HTML 将背景图像添加到网页&#xff1f;三、解释input标签中自动对焦属性的用途四、如何使用 HTML 创建带有自定义项目符号点的无序列表&#xff1f;五、HTML5 中progress元素的用途是什么&#xff1f;六、如何创建适应不同屏幕尺寸的响应式视频…

免费且好用的 MySQL 客户端

DBeaver 支持 Mac、Windows、Linux&#xff0c;提供 Eclipse 插件。社区版免费&#xff0c;支持主流的关系型数据库 官网地址&#xff1a;DBeaver Community | Free Universal Database Tool MySQL WorkBench MySQL WorkBench 是官方出品的客户端&#xff0c;支持 Mac、Windo…

如何打造稳健高效的数据库的基础设施?数据库云提出创新方案

引言 数据库的云化、丰富业务场景下多元的数据库类型、公有云与私有云交织的IT架构&#xff0c;叠加信创影响使得企业内部的基础设施日益复杂&#xff0c;如何高效管理多元的数据库和多云异构基础设施正成为企业面临的严峻挑战。 在此背景下&#xff0c;数据库云应运而生。数…