LeetCode - 贪心算法 (Greedy Algorithm) 集合 [分配问题、区间问题]

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/139242199

饼干

贪心算法,是在每一步选择中,都采取当前状态下,最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法,在解决各种问题时被广泛应用,包括数组操作、字符串处理、图论等。

贪心算法包括:分配问题区间问题

  1. 455. 分发饼干 - 分配问题
  2. 135. 分发糖果 - 分配问题
  3. 605. 种花问题 - 分配问题
  4. 406. 根据身高重建队列 - 分配问题
  5. 435. 无重叠区间 - 区间问题
  6. 452. 用最少数量的箭引爆气球 - 区间问题
  7. 763. 划分字母区间 - 区间问题
  8. 121. 买卖股票的最佳时机 - 区间问题

1. 分配问题

455. 分发饼干 - 分配问题:

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        """
        时间复杂度,来自于排序,O(mlogm + nlogn)
        空间复杂度,类似,O(logm + logn)
        """
        g = sorted(g)  # 排序
        s = sorted(s)
        n, m = len(g), len(s)  # 序列数量
        i, j = 0, 0
        while i < n and j < m:  # 全部遍历
            if g[i] <= s[j]:  # 判断是否吃饱
                i += 1  # 孩子满足条件
            j += 1  # 饼干满足条件
        return i

135. 分发糖果 - 分配问题:

class Solution:
    def candy(self, ratings: List[int]) -> int:
        """
        时间复杂度 O(n),空间复杂度 O(n)
        """
        n = len(ratings)  # 序列长度
        res = [1] * n  # 每个孩子至少1个糖果
        # 正序遍历
        for i in range(1, n):
            if ratings[i] > ratings[i-1]:
                res[i] = res[i-1] + 1  # 要是后面+1
        # print(f"[Info] res: {res}")
        # 逆序遍历
        for i in range(n-1, 0, -1):
            if ratings[i-1] > ratings[i]:
                # 逆序需要最大值
                res[i-1] = max(res[i-1], res[i]+1)  
        # print(f"[Info] res: {res}")
        return sum(res)

605. 种花问题 - 分配问题:

class Solution:
    def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
        """
        时间复杂度 O(n),空间复杂度 O(1)
        """
        res = 0  # 种花数量
        m = len(flowerbed)  # 花坛长度
        for i in range(m):
            # 前面是0,中间是0,最后是0,注意边界
            if (i==0 or flowerbed[i-1] == 0) and (flowerbed[i] == 0) and (i==m-1 or flowerbed[i+1]==0):
                res += 1
                flowerbed[i] = 1
        return res >= n

406. 根据身高重建队列 - 分配问题,读懂题,根据 -p[0] 和 p[1] 排序,再进行插入,根据 p[1],进行插入。

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        """
        插入之前的位置
        时间O(n^2),空间O(logn)
        """
        # p[0] 从大到小排序,再次根据 p[1] 从小到大排序
        people.sort(key=lambda x: (-x[0], x[1]))  
        # print(f"[Info] people: {people}")
        n = len(people)  # 人数
        res = []
        for p in people:
            # print(f"[Info] res: {res}")
            # 根据 p 值的第2位 [正好有k个人],进行排序插入
            res.insert(p[1], p)  # 在p[1]前一个位置插入
        return res

2. 区间问题

435. 无重叠区间 - 区间问题

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        """
        时间复杂度 O(nlogn) 空间复杂度 O(logn)
        """
        # 根据 end 值排序
        intervals = sorted(intervals, key=lambda x: x[1])
        # print(f"[Info] intervals: {intervals}")
        n = len(intervals)
        res = 0
        prev = intervals[0][1]  # 第1个值的末尾值
        for i in range(1, n):  # 从第2个值开始
            if intervals[i][0] < prev:  # 前值小于后值
                res += 1  # 相交
            else:
                prev = intervals[i][1]  # 遍历下一个
        return res

452. 用最少数量的箭引爆气球 - 区间问题,435 题的变换

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        """
        区间类型题,与 435 类似
        时间复杂度 O(nlogn),空间复杂度 O(logn)
        """
        # 尾部排序
        points = sorted(points, key=lambda x: x[1])
        n = len(points)
        prev = points[0][1]  # 前值
        res = 0
        for i in range(1, n):
            if prev >= points[i][0]:
                res += 1  # 重叠值,即1箭射中2个
            else:
                prev = points[i][1]
        return n - res  # 最终值是差值

763. 划分字母区间 - 区间问题,记录字母最后出现的位置,与之前最大位置比较。

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        """
        时间复杂度 O(n),空间复杂度 O(len(s))
        """
        n=len(s)  # 序列长度
        last=[0]*26  # 字母数量
        
        # 遍历获取最后出现的位置
        for i in range(n):
            j=ord(s[i])-ord('a')
            last[j]=max(i,last[j])  # 字母最后出现的位置

        start,end=0,0
        res=[]
        for i in range(n):
            j=ord(s[i])-ord('a')
            # 当前字母j最后出现的位置last[j],与之前end,取最大值
            end=max(end,last[j])
            if end==i:  # end如果等于i
                res.append(end-start+1) # 序列长度
                start=end+1  # 起始位置移动
        return res

121. 买卖股票的最佳时机 - 区间问题

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        """
        时间复杂度 O(n),空间复杂度 O(1)
        """
        n=len(prices)  # 全部数量
        res=0  # 结果
        for i in range(1,n):
            # 累加区间价格
            res+=max(0,prices[i]-prices[i-1])
        return res

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

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

相关文章

【MySQL】库的操作+表的操作

库的操作表的操作 1.库的操作1.1创建数据库1.2删除数据库1.3查找数据库1.4修改数据库1.5数据库备份和恢复1.6查看连接情况 2.库的操作2.1创建表2.2查看表结构2.3修改表2.4删除表 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; …

Petalinux 制作ZYNQ镜像文件流程

1概述 在Zynq-7000 SoC中搭建运行Linux&#xff0c;嵌入式软件栈。 处理器系统引导是一个分两个阶段的过程。第一个阶段是一个内部 BootROM&#xff0c;它存储 stage-0 的引导代码。BootROM 在 CPU 0 上执行&#xff0c;CPU 1 执行等待事件&#xff08;WFE&#xff09;指令。…

单片机通信协议(1):SPI简介

关于SPI SPI&#xff08;串行外设接口&#xff09;是板载设备间通信接口之一。它是由摩托罗拉公司&#xff08;飞思卡尔半导体&#xff09;推出的。由于其简单性和通用性&#xff0c;它被纳入各种外围设备中&#xff0c;并与飞利浦I2C总线并列。 SPI的三线或四线信号数量比IIC…

connection problem,giving up

参考&#xff1a; https://zhuanlan.zhihu.com/p/93438433 仅仅安装 sudo apt-get install xrdp 在用RDP远程的时候总是卡在登录界面&#xff0c;connection problem,giving up&#xff0c; some problem… 第一步&#xff1a; sudo apt-get install xserver-xorg-core sudo…

接口性能测试复盘:解决JMeter超时问题的实践

在优化接口并重新投入市场后&#xff0c;我们面临着一项关键任务&#xff1a;确保其在高压环境下稳定运行。于是&#xff0c;我们启动了一轮针对该接口的性能压力测试&#xff0c;利用JMeter工具模拟高负载场景。然而&#xff0c;在测试进行约一分钟之后&#xff0c;频繁出现了…

【OpenVINO™】在C#中使用 OpenVINO™ 部署 YOLOv10 模型实现目标

文章目录 1. 前言1.1 OpenVINO™ C# API1.2 YOLOv10 2. 模型获取2.1 源码下载2.2 配置环境2.3 下载模型 3. Yolov10 项目配置3.1 项目创建与环境配置3.2 定义模型预测方法3.2.1 定义目标检测模型方法3.2.2 使用OpenVINO™ 预处理接口编译模型 3.2 模型预测方法调用 4. 项目运行…

在Linux中 --help 和 -h 的区别

在Linux命令行工具中&#xff0c;--help 和 -h&#xff08;而不是 -help&#xff09;是常见的选项&#xff0c;用于显示工具的帮助信息。 --help&#xff1a; 这是一个长选项&#xff08;long option&#xff09;&#xff0c;用于提供详细的帮助信息。许多工具都支持这个选项。…

这款信创FTP软件,可实现安全稳定的文件传输

信创&#xff0c;即信息技术应用创新&#xff0c;2018年以来&#xff0c;受“华为、中兴事件”影响&#xff0c;国家将信创产业纳入国家战略&#xff0c;并提出了“28n”发展体系。“8”具体指金融、石油、电力、电信、交通、航空航天、医院、教育等主要行业。目前企业使用比较…

ElementPlus-日期选择器实现周选择

ElementPlus的日期选择器实现周选择&#xff0c;并且显示的是日期范围&#xff0c;其效果如下&#xff1a; 首先修改中文语言环境&#xff0c;否则日期选择器是从周日开始的。在main.js文件中加上以下代码&#xff1a; import ElementPlus,{dayjs as elDayjs} from element-…

【包邮送书】你好!C语言

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

使用YOLOv9训练和测试自己的数据集

任务&#xff1a;检测舌头上的裂纹和齿痕 已经有了labelme标注的数据集&#xff0c;并且转为了coco格式 参考&#xff1a; 详细&#xff01;正确&#xff01;COCO数据集&#xff08;.json&#xff09;训练格式转换成YOLO格式&#xff08;.txt&#xff09;_coco数据集的train…

【Fiddler抓包工具】第五节.安卓、IOS抓包+fildder插件

文章目录 前言一、HTTPS抓包 1.1 HTTPS与HTTP区别 1.2 HTTPS抓包设置过程 1.3 错误解决方法 1.4 验证证书是否安装成功 1.5 Firefox HTTPS请求捕获二、IOS设备APP抓包 2.1 APP抓包Fiddler设置 2.2 APP抓包IOS设备设置 2.3 And…

拓展虚拟世界边界,云手机可以做到吗

虚拟世界&#xff0c;AI&#xff0c;VR等词汇是21世纪最为流行的词汇&#xff0c;在科技背后&#xff0c;这些词汇的影响变得越来越大&#xff0c;已经走进了人们的世界&#xff0c;比如之前APPLE发布的vision pro&#xff0c;使人们能够更加身临其境的体验到原生os系统&#x…

linux下docker 的使用(2)

上期我们讲了网络&#xff0c;现在来进行最后的 docker的基础内容 java项目的部署 假如说 我们java 项目已经写好了&#xff0c;现在在maven中打包一下我们的项目&#xff0c;然后会得到一个jar包&#xff0c;把jar包 上传到虚拟机上 点击package 命令&#xff0c;会得到一个…

js toFixed()四舍五入丢失精度问题处理

js toFixed()四舍五入丢失精度问题处理 错误展示 看了下lodash的代码&#xff0c;大概是通过使用科学计数法扩大10的n次&#xff0c;将操作数化为整数运算&#xff0c;可以避免精度丢失。 /*** Creates a function like _.round.** private* param {string} methodName The …

艾体宝干货 | 教程:使用ntopng和nProbe监控网络流量

本教程旨在分享如何通过 ntopng 和 nProbe 这两款工具&#xff0c;深入了解和掌握网络流量监控的艺术。我们将提供从基本概念到高级应用的全面指导&#xff0c;涵盖了在多种平台和设备上的部署和配置步骤。不论您是专业人员还是技术爱好者&#xff0c;跟随本教程&#xff0c;都…

IPD管理体系指南

目录 简介 CSDN学院 作者简介 简介 学习任何新的和识或体系&#xff0c;都是需要从这个体影涉及的概念开始的。 IPD 合集也是遵活的这个基础逻辑。 通过 100 例的内容&#xff0c;先将 IPD 涉及到的机含点做了一个统一的梳理。 而本期课程呢&#xff0c;作为IPD 体系的前…

文盘Rust -- 生命周期问题引发的 static hashmap 锁

100编程书屋_孔夫子旧书网 2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。项目地址:https://github.com/jiashiwen/interactcli-rs。 春节以前看到axum已经0.4.x了,于是想看看能不能用rust做个服务端的框架。 春节…

已解决ModuleNotFoundError : No module named ‘pandas亲测有效!!!

已解决ModuleNotFoundError : No module named ‘pandas亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 报错问题解决思路解决方法 报错问题 在运行Python代码时&#xff0c;你可能会遇到以下报错信息&#xff1a; ModuleNotFoundError: No module named pandas这个…