代码随想录Day31:贪心算法Part1

news2024/11/26 4:39:36

贪心算法的理论基础

主要的思路就是通过想局部最优解然后看能不能推导出全局最优,但是贪心算法没有统一的套路,每一个问题的贪心思路都可以非常不一样


Leetcode 455. 分发饼干

讲解前:

这时第一道贪心算法的题目,所以很简单,然后我也没有想太多莫名其妙的就写出来了,大致思路就是孩子的数量是这道题的首要目标,那么为了能让更多的孩子满足,我们要避免浪费饼干的情况,也就是说如果有孩子1,3和饼干1,3,我们不能把3喂给1,导致孩子3只剩下饼干1不能饱,最合理的思路就是尽可能的把小饼干给小孩子,所以我就把饼干和孩子都从大到小排序了之后然后一个一个对比,能给就给

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()
        s.sort()
        res = 0
        i = 0

        for cookie in s:
            if i < len(g) and cookie >= g[i]:
                res = res + 1
                i = i + 1
        
        return res
讲解后:

卡哥的思路和我的一样,并且我觉得我这个思路其实更好理解一点,通过用小饼干满足小的小孩,这样不用嵌套for和while循环


Leetcode 376. 摆动序列

讲解前:

完全没什么思路,感觉这道题好难,子序列可以不用连续,而且还有多个需要找

讲解后:

这道题的关键其实就在于理解透彻贪心的点,因为你会发现当你写代码的时候,这道题就好像是一个普通的通过一次遍历就能解决的问题,不容易看出我们的局部解是什么,其实这道题的核心思路是,如果要找到一个从一个数组中找一个最长的子序列并且保证都是摆动序列,可以反过来想

摆动序列把图画出来,你会发现每一个峰值的点都是一个可以加入到摇摆序列中的数字,那我们贪心贪的就应该是这些峰值的值,局部的最优解就是但凡我们当前的数字满足作为一个峰值的条件,那么我们就应该把他算上,然后呢只要我们确保了没有落下一个峰值,在遍历整个数组的情况下,就能收集到最长的摇摆序列

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        res = 1
        pre_diff = 0

        for i in range(0, len(nums) - 1):
            cur_diff = nums[i + 1] - nums[i]
            if (cur_diff > 0 and pre_diff <= 0) or (cur_diff < 0 and pre_diff >= 0):
                res = res + 1
                pre_diff = cur_diff
        
        return res

这里为了方便我们的代码不用处理edge case,做两个处理,第一就是把pre_diff先设成0,这样从第一个数字遍历的时候我们可以确保res会加1,然后把res一开始就初始化为1可以确保最后一个数字也会直接算加入到了res中,因为题目说了只有一个元素或者只有两个不等的元素也算作摇摆序列,这里还需要注意的是我们的pre_diff只需要在我们发现了一个新的要加入摇摆序列的值的时候再更新到旧的那里去避免出现这种情况

也就是当一开始我们把1算入答案后,pre_diff更新成2-1=1,这时候,按理来说除非再出现一个cur_diff的值小于0也就是折线图往下走的峰值,才能把2算入到答案中去,所以这意味着当我们更新完pre_diff之后,需要让他保持在1,而不是像上图这样在for循环的每一个循环中都让pre_diff = cur_diff,这样会出现错误,导致加入不该加的元素 


Leetcode 53. 最大子数组和

讲解前:

这道题主要的思路是明白局部的最优解其实就是当前的子序列中能够得到的最大和是多少,如果我们遍历整个数组并且一个一个扩大我们的这个子序列,直到和数组一样大,我们就能找到所有的possible 子数组,同时我们又一直在计算子数组中最大的值是多少,这样就可以得到整体最优解了

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        res = float('-inf')
        cur_sum = 0

        for num in nums:
            if cur_sum < 0:
                cur_sum = num
            else:
                cur_sum = cur_sum + num

            res = max(res, cur_sum)

        return res

然后呢做到这一点需要明白一个道理就是我们在遍历的时候,如果发现了当前的子数组和已经变成了负数,就是if statement 中的情况,那就要注意了,这意味着当遍历到下一个数字的时候,如果这个数字是负数,那只会让我们的连续和变得更小,如果这个数是正数,那么算上他还不如直接把他作为新的子数组的开始,还不用被拖累变小,所以无论正数还是负数,当我们目前的子数组连续和已经小于0了之后,就应该在下一个数字直接开启一个新的子数组,这就是局部的最优解,保证目前记录的子数组是包括当前数字的最大值

讲解后:

卡哥的讲解和我的一样,一样的思路

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Open CASCADE学习|放样建模

在CAD软件中&#xff0c;Loft&#xff08;放样&#xff09;功能则是用于创建三维实体或曲面的重要工具。通过选取两个或多个横截面&#xff0c;并沿这些横截面进行放样&#xff0c;可以生成复杂的三维模型。在CAD放样功能的操作中&#xff0c;用户可以选择不同的选项来定制放样…

【新手指南】创建简单搜索引擎优化报告

搜索引擎优化&#xff08;SEO&#xff09;是一项长期投资&#xff0c;需要持续监控&#xff0c;以确保产生您所期望的结果。这就是生成搜索引擎优化报告的重要性所在–这份报告会告诉你哪些有效&#xff0c;哪些无效&#xff0c;哪些需要改进。 如果你从未创建过搜索引擎优化报…

C语言 文件函数

目录 1. 文件的打开和关闭 2. 文件的顺序读写 2.1 顺序读写函数介绍 2.2读文件&#xff08;读文件只能读一次&#xff09; 2.3写文件 3. 文件的随机读写 3.1 fseek 3.2 ftell 3.3 rewind 4.文件读取结束的判定 4.1 被错误使误的 feof 我对读写的理解&#xff1a;(从…

SpringBoot 集成H2数据库,启动执行sql, 中文乱码

目录 H2数据库介绍 SpringBoot版本&#xff1a;SpringBoot 2.1.12.RELEASE 快速集成H2&#xff0c;maven依赖 快速集成H2&#xff0c;数据源及关键参数配置 spring.datasource.schema参数&#xff08;建表SQL脚本&#xff09; spring.datasource.data参数&#xff08;更新、…

【鹤城杯 2021】 CRYPTO刷题

easy_crypto 附件easy_crypto.txt&#xff0c;内容是社会核心主义观 公正公正公正诚信文明公正民主公正法治法治诚信民主自由敬业公正友善公正平等平等法治民主平等平等和谐敬业自由诚信平等和谐平等公正法治法治平等平等爱国和谐公正平等敬业公正敬业自由敬业平等自由法治和…

联想电脑VMware虚拟机VT开启虚拟化

以联想电脑为例。 关机重启&#xff0c; 有的电脑是按F2&#xff0c; 有的是按fnF2 进入BIOS&#xff0c;左右键&#xff0c;选择Configuration&#xff0c; 再上下键选择 Intel Virtual Technology 按回车键&#xff0c;再按上下键选择 Enable &#xff0c;回车确认。 按fn…

【VScode】同时编辑多处

【VScode】同时编辑多处 1. 多光标自定义批量编辑2. 选择多个&#xff0c;同时操作(批量选中局部匹配项)3. 取消选择4. 在不移动光标的情况下滚动屏幕5. 批量选中全局匹配项6.重点6.1 通过上下键选择多行6.2 同时选中所有行的末尾6.3 选中多列另一种方式6.4 通过正则的方式配置…

dockerhub右键快速搜索脚本

Chrome 浏览器扩展的后台脚本&#xff0c;用于创建右键菜单项&#xff0c;并根据用户的操作在新的标签页中打开 Docker Hub 网站或者进行搜索。 // 创建右键菜单项&#xff0c;用于打开 Docker Hub 网站 chrome.contextMenus.create({id: search-home, // 菜单项的唯一标识符t…

移除元素Java实现

题意 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 额外空间 并 原地 修改数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元…

Netty实现udp服务器

1、TCP与UDP通信协议 网络传输层协议有两种&#xff0c;一种是TCP&#xff0c;另外一种是UDP。 TCP是一种面向连接的协议&#xff0c;提供可靠的数据传输。TCP通过三次握手建立连接&#xff0c;并通过确认和重传机制&#xff0c;保证数据的完整性和可靠性。TCP适用于对数据准…

红豆Cat 1开源|项目二: 从0-1设计一款MQTT版本DTU(支持GNSS)产品的软硬件全过程

MQTT版DTU&#xff08;GNSS&#xff09;项目概述 DTU 通常指的是数据传输单元&#xff0c;它是一种用于将现场设备的数据通过无线或有线方式传输到远程控制中心的设备。DTU 可以实现设备与控制中心之间的数据通信&#xff0c;以便实时监测和控制设备的运行状态。 产品定义描述…

SpringBoot内容协商快速入门Demo

1.什么内容协商 简单说就是服务提供方根据客户端所支持的格式来返回对应的报文&#xff0c;在 Spring 中&#xff0c;REST API 基本上都是以 json 格式进行返回&#xff0c;而如果需要一个接口即支持 json&#xff0c;又支持其他格式&#xff0c;开发和维护多套代码显然是不合理…

面对DDOS攻击,有哪些解决办法

随着互联网带宽的持续增长以及DDOS黑客技术的发展&#xff0c;DDOS拒绝服务攻击的实施变得愈发容易。商业竞争、打击报复、网络敲诈等多种因素&#xff0c;各行各业的用户都曾受到DDOS攻击的威胁。 一旦遭受到DDOS攻击&#xff0c;随之而来的就是业务宕机&#xff0c;用户无法…

C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组

本文介绍基于C语言GDAL库&#xff0c;批量读取大量栅格遥感影像文件&#xff0c;并生成各像元数值的时间序列数组的方法。 首先&#xff0c;我们来明确一下本文所需实现的需求。现在有一个文件夹&#xff0c;其中包含了很多不同格式的文件&#xff0c;如下图所示。 其中&#x…

机器学习-08-关联规则和协同过滤

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中关联规则和协同过滤。 参考 机器学习&#xff08;三&#xff09;&#xff1a;Apriori算法&#xff08;算法精讲&#xff09; Apriori 算法 理论 重点 MovieLens:一个常用的电影推荐系统领域的数据集 2…

2024阿里云2核4G服务器优惠价格表_2核4G性能测评

阿里云2核4G服务器多少钱一年&#xff1f;2核4G服务器1个月费用多少&#xff1f;2核4G服务器30元3个月、85元一年&#xff0c;轻量应用服务器2核4G4M带宽165元一年&#xff0c;企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…

6种xinput1_3.dll丢失的解决办法,并探讨xinput1_3.dll丢失的原因及其属性。

xinput1_3.dll扮演着Visual C运行时库中不可或缺的角色&#xff0c;众多电脑软件都需依赖它以确保正常运行。 当您启动软件时&#xff0c;若遇到xinput1_3.dll无法执行代码的提示&#xff0c;可能会导致软件无法如常启动或运行。本文将向您介绍6种解决方案&#xff0c;并探讨xi…

潍微科技-水务信息管理平台 ChangePwd SQL注入漏洞复现

0x01 产品简介 水务信息管理平台主要帮助水务企业实现水质状态监测、管网运行监控、水厂安全保障、用水实时监控以及排放有效监管,确保居民安全稳定用水、环境有效保护,全面提升水务管理效率。由山东潍微科技股份有限公司研发,近年来,公司全力拓展提升水务、水利信息化业务…

二叉数应用——最优二叉树(Huffman树)、贪心算法—— Huffman编码

1、外部带权外部路径长度、Huffman树 从图中可以看出&#xff0c;深度越浅的叶子结点权重越大&#xff0c;深度越深的叶子结点权重越小的话&#xff0c;得出的带权外部路径长度越小。 Huffman树就是使得外部带权路径最小的二叉树 2、如何构造Huffman树 &#xff08;1&#xf…