当前位置: 首页 > news >正文

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, 0while 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 += 1flowerbed[i] = 1return 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 = 0prev = 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 = 0for 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,0res=[]for i in range(n):j=ord(s[i])-ord('a')# 当前字母j最后出现的位置last[j],与之前end,取最大值end=max(end,last[j])if end==i:  # end如果等于ires.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

相关文章:

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

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/139242199 贪心算法&#xff0c;是在每一步选择中&#xff0c;都采取当前状态下&#xff0c;最好或最优&#xff08;即最有利&#xff09;的选择&…...

Linux中ftp配置

一、ftp协议 1、端口 ftp默认使用20、21端口 20端口用于建立数据连接 21端口用于建立控制连接 2、ftp数据连接模式 主动模式&#xff1a;服务器主动发起数据连接 被动模式&#xff1a;服务器被动等待数据连接 二、ftp安装 yum install -y vsftpd #---下…...

BWVS 靶场测试

一、PHP弱类型 is_numeric() 输入&#xff1a;127.0.0.1/BWVS/bug/php/code.php # 1、源代码分析 如果num不是数字&#xff0c;那么就输出num&#xff0c;同时如果num1&#xff0c;就输出flag。即num要是字符串又要是数字 # 2、函数分析&#xff1a; is_numeric()函数&…...

c++ 里重解释转换之于引用 reinterpret_cast< long >

今天遇到了这一很新奇的写法。模糊中记得王老师也这么讲过。c 里四大转换。把数据重解释为原来数据的引用。虽然也可以直接定义对变量的引用。测试如下&#xff1a; 咱们从反汇编再了解下 c 编译器是怎么处理这种写法的&#xff1a; 谢谢...

JAVASE2

封装的步骤&#xff1a; 1、所有属性私有化&#xff0c;使用private关键字进行修饰&#xff0c;private表示私有的&#xff0c;修饰的所有数据只能在本类中访问 2、对外提供简单入口&#xff1a;比如说被private修饰的成员变量&#xff0c;在其他类中只能通过getXxx/setXxx方法…...

ora-00392 ora-00312错误处理

检查当前日志组状态 对日志组进行clear操作 重新开库无报错...

网页、h5默认滚动条样式重构

文章目录 前言一、使用步骤1、在想要滚动的元素上设置相应的css类名2.设置样式 总结 前言 此文章用于&#xff0c;让我自己快速设置 浏览器、h5 默认滚动条样式…… 一、使用步骤 1、在想要滚动的元素上设置相应的css类名 代码如下&#xff1a; <div class"list scro…...

香橙派AIpro测评上手指南

一、前言 首先非常荣幸受到邀请参加本次香橙派开发板的测评活动&#xff0c;除了令人眼前一亮&#xff0c;做工非常精细的开发板&#xff0c;举办方还非常贴心地准备了散热套件&#xff0c;以及烧录好系统的TF卡&#xff0c;甚至准备了电源适配器&#xff0c;数据线&#xff1…...

GBDT 算法【python,机器学习,算法】

GBDT 即 Gradient Boosting Decision Tree 梯度提升树&#xff0c; 是一种迭代的决策树算法&#xff0c;又叫 MART(Multiple Additive Regression Tree)&#xff0c; 它通过构造一组弱的学习器(树)&#xff0c;然后把多棵决策树的结果累加起来作为最终的预测输出。该算法将决策…...

软考 系统架构设计师系列知识点之SOME/IP与DDS(3)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之SOME/IP与DDS&#xff08;2&#xff09; 本文内容参考&#xff1a; 车载以太网 - SOME/IP简介_someip-CSDN博客 https://zhuanlan.zhihu.com/p/369422441 什么是SOME/IP?_someip-CSDN博客 SOME/IP 详解系列&#…...

将AI大模型装进你的手机,你愿意么?

大数据产业创新服务媒体 ——聚焦数据 改变商业 AI大模型的发展&#xff0c;有两个方向&#xff0c;一个是模型越做越大&#xff0c;以规模来提升性能。还有一个重要的方向&#xff0c;就是通过将模型做小&#xff0c;来嵌入手机、电脑等计算终端&#xff0c;这同样是值得关注…...

前端面试题12-22

12 Proxy是什么&#xff0c;有什么作用&#xff1f; Proxy 是 ES6 (ECMAScript 2015) 引入的一种元编程特性。它允许你创建一个对象&#xff0c;该对象可以拦截和定义基本操作&#xff08;例如属性查找、赋值、枚举、函数调用等&#xff09;。Proxy 提供了一种机制&#xff0c…...

【论文解读】Performance of AV1 Real-Time Mode

论文下载地址:Performance of AV1 Real-Time Mode 时间:2020.10 级别:IEEE 作者:Ludovic Roux 摘要 背景:COVID-19疫情增加了对数字互动的需求,使得实时或低延迟编解码器变得更加重要。现状:大多数编解码器,包括AV1,主要关注于编码效率,这是视频点播(VOD)的主要改…...

java处理中文脱敏

方法一&#xff0c;简单的&#xff0c;不计算文字长度去设置脱敏 public static String dataDesensitization1(String content){String regex "(.{2}).*(.{2})";return ReUtil.replaceAll(content, regex, matcher -> {try {if (CharSequenceUtil.isBlank(match…...

【Linux网络】端口及UDP协议

文章目录 1.再看四层2.端口号2.1引入linux端口号和进程pid的区别端口号是如何生成的传输层有了pid还设置端口号端口号划分 2.2问题2.3netstat 3.UDP协议3.0每学一个协议 都要讨论一下问题3.1UDP协议3.2谈udp/tcp实际上是在讨论什么&#xff1f; 1.再看四层 2.端口号 端口号(Po…...

Unity 生成模版代码

1、创建模版代码文本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class ClassNameScritpItem : MonoBehaviour {public GameObject go;// Start is called before the first frame updatevoid Start(){go new GameObject();}// …...

【ai】chatgpt的plugin已经废弃

发现找不到按钮,原来是要申请: https://openai.com/index/chatgpt-plugins/ 发现申请已经跳转了,好像是废弃了? 不接受新插件了,但是openai的api 是可以继续用的。 https://openai.com/waitlist/plugins/We are no longer accepting new Plugins, builders can now create…...

2024年03月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 运行如下代码,若输入整数3,则最终输出的结果为?( ) def f(x):if x==1:s=1else:s...

多旋翼无人机机场考哪些内容?

多旋翼无人机机场考试的内容主要包括理论和实飞两部分。 理论考试主要涵盖无人机相关的知识&#xff0c;包括无人机的原理、结构、操作规范等。 实飞考试则主要考察飞行技能&#xff0c;包括飞行操作、航线规划、飞行稳定性等。 具体来说&#xff0c;实飞部分可能包括使用GPS…...

【前端每日基础】day23——箭头函数

箭头函数是ES6&#xff08;ECMAScript 2015&#xff09;引入的一种新的函数表达式语法。相比传统函数&#xff0c;箭头函数有简洁的语法&#xff0c;并且不绑定自己的this、arguments、super或new.target。以下是详细介绍箭头函数的各个方面&#xff1a; 基本语法 单参数箭头函…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...