代码随想录算法训练营 Day31 贪心算法1

Day31 贪心算法1

理论基础

贪心算法的本质:找到每个阶段的局部最优,从而去推导全局最优

贪心的两个极端:要么觉得特别简单,要么觉得特别难

贪心无套路
不像二叉树、递归,有固定模式

贪心题目的思考方式
做题的时候,想到局部最优是什么,然后能够推出全局最优,且想不到反例,就可以试一下贪心

455.分发饼干

思路

局部最优:用最小的饼干尺寸满足最小胃口的孩子
全局最优:根据饼干尺寸从小到大一步步满足孩子胃口,满足就分配,不满足就用下一个
for循环遍历所有的饼干,判断如果满足,指向孩子胃口的指针加一,结果加一

尝试写代码:

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        s.sort()
        g.sort()
        result = 0
        child = 0
        for i in range(len(s)):
            if child < len(g) and s[i] >= g[child]:
                result += 1
                child += 1
        return result

成功通过

根据代码随想录
局部最优:每次找到一个大的饼干,满足胃口大的小孩
全局最优:可以喂饱的小孩子的数量最大
局部最优好像可以推出全局最优,且找不到反例

代码要点:

  1. for循环控制小孩胃口
  2. if和index控制饼干
  3. 外面for循环遍历胃口,里面遍历饼干,不可以颠倒

大饼干满足大胃口:

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        s.sort()
        g.sort()
        result = 0
        index = len(s) - 1
        for i in range(len(g) - 1, -1, -1):
            if index >= 0 and g[i] <= s[index]:
                result += 1
                index -= 1
        return result

376. 摆动序列

思路

局部最优:找到当前的满足摆动序列的元素
全局最优:每一个组成字序列的元素都满足摆动序列
通过删除不满足的数,使得最终的nums数组为摆动序列

尝试写代码:

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        index = 0
        if len(nums) <= 1:
            return len(nums)
        while index < len(nums):
            if index == 1:
                if nums[index] == nums[index - 1]:
                    del nums[index]
                    continue
            elif nums[index - 1] - nums[index - 2] < 0 and nums[index] - nums[index - 1] < 0:
                del nums[index]
                continue
            elif nums[index - 1] - nums[index - 2] > 0 and nums[index] - nums[index - 1] > 0:
                del nums[index]
                continue
            index += 1
        return len(nums)

测试用例通过,但结果不对

根据代码随想录:
要点:

  1. 画图,需要删除的是单调坡上的元素
  2. 局部最优:单调坡中的元素删除
  3. 全局最优:得到最长的摆动序列
  4. 其实没有必要真的具体删除元素,因为题目求的是长度,因此只需要遇到摆动就加一,然后返回数值就行
  5. 判断峰值:prediff和curdiff一大一小
  6. 特殊情况:需要考虑遇到平坡的情况,在判断prediff时,包含0
  7. 特殊情况:如果总长度只有两个元素,默认两个元素的前面有个平坡,result一开始为1,即包含最后一个摆动,这样就可以将这种情况加入整体逻辑中
  8. 特殊情况:单调坡中有平坡,因此prediff只在有摆动的时候,才改变

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最终代码:

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        prediff = 0
        curdiff = 0
        result = 1
        if len(nums) == 1:
            return 1
        for i in range(len(nums) - 1):
            curdiff = nums[i + 1] - nums[i]
            if (prediff >= 0 and curdiff < 0) or (prediff <= 0 and curdiff > 0):
                result += 1
                prediff = curdiff
        return result

总结:
我一开始的思路只是顺着序列遍历比较,没有考虑到整体情况,因此可能会漏掉一些数,导致结果不对。代码随想录是通过画图,将所有的数值放在一起比较,发现峰值不能删,这样结果是可靠的

53. 最大子序和

思路

不知道怎么样算局部最优

根据代码随想录
本题也可以用动规来做

要点:

  1. 如果当前的连续和为负数,再加后面的数只会让和最小
  2. 局部最优:连续和为负数时,选择下一个数为新起点重新计算
  3. 全局最优:找到最大连续子数组的和
  4. 每次记录时,用result记录局部最大

最终代码:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        result = float('-inf')
        count = 0
        for i in range(len(nums)):
            count += nums[i]
            if count > result:
                result = count
            if count < 0:
                count = 0
        return result

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS实战开发-使用List组件实现导航与内容联动的效果。

1 卡片介绍 使用ArkTS语言&#xff0c;实现一个导航与内容二级联动的效果。 2 标题 二级联动&#xff08;ArkTS&#xff09; 3 介绍 本篇Codelab是主要介绍了如何基于List组件实现一个导航和内容的二级联动效果。样例主要包含以下功能&#xff1a; 切换左侧导航&#xff…

SpringMVC源码分析(七)--数据绑定工厂

1.数据绑定工厂的使用 数据绑定工厂能够创建数据绑定器,将数据绑定到对象中,比如说当接收到请求时,经过http协议解析后数据刚开始都是字符串,此时我们希望将这些属性进行类型转换,并为对象赋值,示例如下: 1)先创建两个实体类Student和Teacher @Getter @Setter @ToSt…

学习鸿蒙基础(10)

目录 一、轮播组件 Swiper 二、列表-List 1、简单的List 2、嵌套的List 三、Tabs容器组件 1、系统自带tabs案例 2、自定义导航栏&#xff1a; 一、轮播组件 Swiper Entry Component struct PageSwiper {State message: string Hello Worldprivate SwCon: SwiperControl…

[Python人工智能] 四十五.命名实体识别 (6)利用keras构建CNN-BiLSTM-ATT-CRF实体识别模型(注意力问题探讨)

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解融合Bert的实体识别研究,使用bert4keras和kears包来构建Bert+BiLSTM-CRF模型。这篇文章将详细结合如何利用keras和tensorflow构建基于注意力机制的CNN-BiLSTM-ATT-CRF模型,并实现中文实体识别…

基于单片机宿舍防火防盗系统的设计

**单片机设计介绍&#xff0c;基于单片机宿舍防火防盗系统的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机宿舍防火防盗系统的设计概要主要涉及单片机技术的应用&#xff0c;以实现对宿舍环境的防火和防盗功能的…

31-5 命令执行漏洞 - RCE漏洞利用

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、打开pikachu靶场 二、远程命令执行利用 正常情况下这一关卡就是个ping命令,我们只能输入个 ip 靶场就就会ping 这ip 但是我们可以用管道符拼接来执行其他命令,详细可以看我…

Android 开发投屏软件

一、背景 作为Android开发总会有给他人share自己APP情况&#xff0c;一般在线会议投屏&#xff0c;总是需要在手机上安装对应会议软件特别麻烦~ 二、投屏 Android Studio已经自带了投屏能力&#xff0c;可以在电脑端直接控制手机&#xff0c;同步起来非常方便简单 打开步骤 …

【Docker】搭建简单易用的网站分析工具 - umami

【Docker】搭建简单易用的网站分析工具 - umami 前言 本教程基于绿联的NAS设备DX4600 Pro的docker功能进行搭建&#xff0c;采用umami MySQL实例作为演示。 简介 umami是一个开源的、简单的、易于使用的网站分析工具。其设计目的是提供一个简单、易于理解的方式来查看网站…

ATTCK学习笔记

ATT&CK 前言知识 威胁情报&#xff1a;一般为网络流量中或者操作系统上观察到的能高度表明计算机被入侵的痕迹&#xff0c;例如某病毒的Hash值、服务器的IP地址等等。简单来说&#xff0c;威胁情报就像是当计算机被入侵时所表现出来的某种特征&#xff0c;我们将这些威胁…

Kitex 提供的服务注册与发现 etcd 拓展

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 <br> &#x1f4d8;相关专栏<a href"https://blog.csdn.net/studycodeday/category_12460797.html">…

SmartChart的部署以及可能遇见的报错解决方案

简介 数据可视化是一种将数据转化为图形的技术&#xff0c;可以帮助人们更好地理解和分析数据。但是&#xff0c;传统的数据可视化开发往往需要编写大量的代码&#xff0c;或者使用复杂的拖拽工具&#xff0c;不仅耗时耗力&#xff0c;而且难以实现个性化的需求。有没有一种更…

Linux部分命令

目录 1.文件介绍 2.ls命令 3.目录命令 4.相对路径以及绝对路径 5.命令创建目录&#xff08;文件夹&#xff09; 6.which命令 7.find命令 8.grep命令 9.wc命令 10.echo、tail、重定向符 1.文件介绍 和window不同&#xff0c;Linux没有盘路径&#xff0c;所有的文件都存…

VSCode在文件生成添加作者,创建时间、最后编辑人和最后编辑时间等信息

一、安装插件 我使用的是 korofileheader 二、配置文件 左下角点击设置图标—设置—输入"ext:obkoro1.korofileheader"—点击"在setting.json中编辑" 进入后会自动定位到你添加信息的地方 "Author": "tom", "Date": "…

接口自动化框架搭建(五):生成allure报告

1&#xff0c;安装allure 参考连接&#xff1a; https://blog.csdn.net/lixiaomei0623/article/details/120185069 2&#xff0c;安装python的allure依赖 pip install allure-pytest或者从pycharme上安装 3&#xff0c;生成报告 执行前目录 执行测试用例 import pytest …

js逆向之非对称加密RSA某奇艺登录密码

通过案例主要是学会逆向的过程. 一些正常的js代码可以看懂,可是有些网站会给你混淆, 让你看的不舒服, --打断点慢慢来. # RSA加密 --非对称加密 # 对称加密&#xff1a;加密和解密共用一把钥匙 # 非对称加密: 加密和解密使用两把钥匙 &#xff1a; 公钥&#xff08;加密&…

吴恩达2022机器学习专项课程(一) 4.3 梯度下降的直观理解

问题预览/关键词 本节内容是&#xff1f;J对w求导的含义是&#xff1f;如何确定切线的方向&#xff1f;w在函数J递增处的切线方向是&#xff1f;导数项为正数&#xff0c;w和函数J的关系是&#xff1f;w在函数J递减处的切线方向是&#xff1f;导数项为负数&#xff0c;w和函数…

Visual Studio 2022报错c1083,win11解决办法

如果头文件报错&#xff0c;并且编译器报错是c1083&#xff0c;无法处理的时候&#xff0c;包括卸载重装也是无济于事的时候 此时可以采取一下办法进行修改 出现这个的主要原因是安装 Windows SDK 时版本出错&#xff0c;需要根据自己的 windows 版本选择安装对应版本的 Wind…

Junit深入讲解(JAVA单元测试框架)

1、此处用的是Junit5&#xff0c;此处pom文件需要引的依赖是 <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.1</version><scope>test</scope></depende…

基于STC12C5A60S2系列1T 8051单片机通过单个按键长按次数实现开关机应用

基于STC12C5A60S2系列1T 8051单片机通过单个按键长按次数实现开关机应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍基于STC12C5A60S2系列1T 8051单片机通过单个按…

Linux_应用篇(02) 文件 I/O 基础

本章给大家介绍 Linux 应用编程中最基础的知识&#xff0c;即文件 I/O&#xff08;Input、 Outout&#xff09; &#xff0c; 文件 I/O 指的是对文件的输入/输出操作&#xff0c;说白了就是对文件的读写操作&#xff1b; Linux 下一切皆文件&#xff0c;文件作为 Linux 系统设计…