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

欢迎关注我的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/663723.html

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

相关文章

不同linux账户切换不同的cuda版本

原因 由于服务器中安装了两个版本的cuda&#xff08;cuda10.1和cuda11.1&#xff09;&#xff0c;不同项目可能需要应用不同的cuda版本&#xff0c;但是自己又没有root权限或者只想在使用指定conda环境时改为用指定的cuda版本。总结起来有三种方法&#xff1a; 1、修改软链接指…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.1,2 SPI驱动实验-SPI协议介绍

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Linux实验六:进程间通信(二)

目录 一、实验目的二、实验内容三、实验环境四、参考代码五、实验步骤步骤1. 编辑源代码test6.c步骤2. 编译源代码test6.c步骤3. 运行可执行程序test6步骤4. 进一步调试源代码test6.c 六、实验结果七、实验总结 一、实验目的 1、理解 POSIX 和 System V 提供的 IPC 相关概念&a…

安防监控视频平台LntonCVS视频监控汇聚平台遏制校园暴力保护校园学生安全应用方案

未成年人被誉为祖国的花朵&#xff0c;是我们国家的未来。然而&#xff0c;最近频繁曝出的未成年霸凌事件却引发了社会的广泛关注。这些事件手段残忍&#xff0c;事态恶劣&#xff0c;引发了全社会对如何保护未成年身心健康、规避霸凌事件发生的深刻思考。 为了更好地保障学生的…

从零开始:如何用Electron将chatgpt-plus.top 打包成EXE文件

文章目录 从零开始&#xff1a;如何用Electron将chatgpt-plus.top 打包成EXE文件准备工作&#xff1a;Node.js和npm国内镜像加速下载初始化你的Electron项目创建你的Electron应用运行你的Electron应用为你的应用设置图标打包成EXE文件结语 从零开始&#xff1a;如何用Electron将…

echarts学习:将echats实例代理为响应式对象可能带来的风险

1.起源 最近我在学习如何封装echarts组件&#xff0c;我所参考的其中一篇博客中提到了一个“图表无法显示的问题”。 根据其中的介绍&#xff0c;造成此种问题的原因是因为&#xff0c;使用ref接受了echarts实例&#xff0c;使得echarts实例被代理为了响应式对象&#xff0c;进…

[C#]使用C#部署yolov8的obb旋转框检测tensorrt模型

【测试通过环境】 win10 x64 vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super 版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll&#xff0c;TensorRtExtern源码地址&#xff1a;TensorRT-CShar…

3D视觉系统实现自动化上下料操作

在竞争激烈的汽车制造行业&#xff0c;提高生产效率、降低成本并保证产品质量是企业持续发展的关键。特别是在汽车制造过程中&#xff0c;各种零部件的上下料操作占据了大量的生产时间&#xff0c;因此如何实现这些操作的自动化、高效化成为了一个亟待解决的问题。 富唯智能3D视…

pom文件中,Maven导入依赖出现 Dependency not found

解决方案&#xff1a; 1、首先看一下自己的Maven是否配置好了 2、再检查一下镜像是否正确 3、如果上面都没有问题&#xff0c;看 dependencyManagement 标签 我这个出错&#xff0c;爆一大片红就是因为 这个标签 dependencyManagement 解决方法&#xff1a;在父工程中进行依…

在 Kubesphere 中开启新一代云原生数仓 Databend

上周六&#xff0c;由 KubeSphere 社区联合 Databend 社区以及纵目科技共同组织的云原生 Meetup 北京站在北京圆满落幕。本次 Meetup 活动邀请到了 SkyWalking PMC 成员、青云科技架构及可观测性团队负责人、江苏纵目科技 APM 研发总监、青云科技容器产品经理、数元灵科技 CTO …

JVM内存划分类加载的过程双亲委派模型的详解

JVM内存划分 JVM也就是java进程&#xff0c;这个进程一旦跑起来就会从操作系统这里申请一大块内存空间&#xff0c;JVM接下来就要进一步的对这个大的空间进行划分&#xff0c;划分成不同区域&#xff0c;从而每个区域都有不同的功能作用&#xff0c;一共分为如下几个区域 1.堆…

【数据结构】二叉树-堆(下)-链式二叉树

个人主页~ 二叉树-堆&#xff08;上&#xff09; 栈和队列 二叉树 四、堆的代码实现Heap.hHeap.ctest.c 五、堆的应用堆排序思想进行排序 六、二叉树链式结构的实现BTree.hBTree.ctest.c 四、堆的代码实现 Heap.h #pragma once#include <stdio.h> #include <stdlib…

Leetcode:寻找两个正序数组的中位数

题目链接&#xff1a;4. 寻找两个正序数组的中位数 - 力扣&#xff08;LeetCode&#xff09; 题目分析 1、当只有一个有序数组时&#xff0c;该数组的中位数会将该数组分为两份&#xff1a;左子数组 和 右子数组 2、当有两个有序数组时&#xff0c; 我们仍然可以通过一条分隔…

计算机网络之快重传和快恢复以及TCP连接与释放的握手

快重传和快恢复 快重传可以让发送方尽早得知丢失消息&#xff0c; 当发送消息M1,M2&#xff0c;M3,M4,M5后,假如消息M2丢失&#xff0c;那么按照算法会发送对M2报文前一个报文M1的重复确认&#xff08;M1正常接受到&#xff0c;已经发送了确认),然后之后收到M4,M5,也会发送两…

内网安全之注册和查看证书

注册证书 如图所示&#xff0c;是 Will Schroeder 和 Lee Christensen 发布的 Certified_Pre-Owned 白皮书里面画的证书注册流程: 从图中我们可以看到&#xff0c;证书注册流程如下&#xff1a; 客户端生成一对公、私钥。客户端生成证书签名请求(CSR&#xff0c;Certificate…

linux系统——性能检测工具glances

在linux系统中&#xff0c;由python开发的glances工具是一个功能强大的性能检测工具 可以通过yum进行安装 安装glances后&#xff0c;进入命令界面 glance支持网站模式&#xff0c;将监控到的数据以网站形式显示出来 这里需要用python包管理命令 使用glances -w开放…

Java集合-List(Collection子接口)及其子类(ArrayList、Vector、LinkedList)

List接口是 Collection接口的子接口。 1、List集合类中数据有序&#xff0c; 即添加顺序和取出顺序有序&#xff0c;而且可以重复。 2、List集合类中每个元素都有其对应的顺序索引&#xff0c;即支持索引。例&#xff0c;list.get(2)&#xff1b;取第三个元素。 3、实现类有很多…

百度地图1

地图的基本操作 百度地图3.0文档 百度地图3.0实例中心 设置地图 centerAndZoom(center: Point, zoom: Number)设初始化地图,center类型为Point时&#xff0c;zoom必须赋值&#xff0c;范围3-19级&#xff0c; // 百度地图API功能var map new BMap.Map("map"); //…

CentOS8搭载正反向解析dns服务器

1.介绍&#xff08;是什么&#xff09; DNS&#xff08;Domain Name System&#xff09;&#xff0c;即域名系统&#xff0c;是一个将域名和 IP 地址相互映射的分布式数据库&#xff0c;它可以将用户输入的域名转换成对应的 IP 地址。DNS 由多个服务器组成&#xff0c;分为多个…

企业想要搭建一个虚拟展厅需要多少钱?

企业搭建虚拟展厅的费用会根据多种因素有所不同&#xff0c;主要包括展厅的类型、规模、功能需求、技术复杂度以及服务商的定价策略等。以下是关于虚拟展厅搭建费用的分点说明和归纳&#xff1a; 一、展厅类型&#xff1a; 1、全景实拍展厅&#xff1a; 利用VR全景拍摄技术还…