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, 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

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

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

相关文章

光猫、路由器的路由模式、桥接模式、拨号上网

下面提到的路由器都是家用路由器 一、联网条件 1.每台电脑、路由器、光猫想要上网&#xff0c;都必须有ip地址。 2.电脑获取ip 可以设置静态ip 或 向DHCP服务器(集成在路由器上) 请求ip 电话线上网时期&#xff0c;猫只负责模拟信号和数字信号的转换&#xff0c;电脑需要使…

Spark介绍及RDD操作

Spark介绍及RDD操作 PySpark简介spark特点运行原理spark实例化 SparkCore-RDDRDD创建转换&#xff08;Transformation&#xff09;行动&#xff08;Action&#xff09; PySpark简介 spark特点 运行速度快&#xff1a;DAG内存运算容易使用&#xff1a;Java、Scala、Python、R通…

深入探究 threejs 中的材质与纹理应用

深入探究 threejs 中的材质与纹理应用 一、引言 在三维图形开发领域&#xff0c;Three.js 是一个强大而受欢迎的库。其中&#xff0c;材质与纹理的应用对于创建逼真和吸引人的三维场景起着至关重要的作用。通过对材质和纹理的巧妙运用&#xff0c;可以极大地增强模型的视觉效…

AutoCAD 2024 for Mac(cad设计绘图工具) v2024.3中文激活版

AutoCAD是一款强大的CAD软件&#xff0c;适合于各种领域的设计和绘图。它具有二维图形和三维建模功能、多种文件格式支持、自定义命令和样式、批处理和脚本等特点&#xff0c;可以帮助用户实现高质量的设计和建模。同时&#xff0c;AutoCAD还支持云端存储和共享&#xff0c;方便…

Spring源码之BeanDefinition的加载

Spring源码之BeanFactory和BeanDefinition BeanFactory和BeanDefinitionBeanFactoryBeanDefinition源码分析创建AnnotationConfigApplicationContext对象注册配置类refresh方法 BeanFactory和BeanDefinition BeanFactory BeanFactory是Spring提供给外部访问容器的根接口&…

关于vlookup的第一个参数的个人理解

VLOOKUP&#xff08;查阅值&#xff0c;包含查阅值和返回值的查找区域&#xff0c;查找区域中返回值的列号&#xff0c;精确查找或近似查找&#xff09; 我个人理解&#xff0c;第一个参数应该叫线索值&#xff0c;因为我们要通过它去找与其对应的&#xff08;也就是与其同行的…

7-zip安装教程

一、简介 7-Zip 是一款开源的文件压缩软件&#xff0c;由 Igor Pavlov 开发。它具有高压缩比、支持多种格式、跨平台等特点。使用 C语言编写&#xff0c;其代码在 Github 上开源。 7-Zip的官网&#xff1a; 7-Zip 7-zip官方中文网站&#xff1a; 7-Zip 官方中文网站 7-Zip 的 G…

Day 10:100322. 删除星号以后字典序最小的字符串

Leetcode 100322. 删除星号以后字典序最小的字符串 给你一个字符串 s 。它可能包含任意数量的 ‘’ 字符。你的任务是删除所有的 ’ 字符。 当字符串还存在至少一个 ‘*’ 字符时&#xff0c;你可以执行以下操作&#xff1a; 删除最左边的 ‘*’ 字符&#xff0c;同时删除该星号…

C语言 | Leetcode C语言题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; int numDistinct(char* s, char* t) {int m strlen(s), n strlen(t);if (m < n) {return 0;}unsigned long long dp[m 1][n 1];memset(dp, 0, sizeof(dp));for (int i 0; i < m; i) {dp[i][n] 1;}for (int i m - 1; i > 0;…

Springboot校园食堂智能排餐系统-计算机毕业设计源85935

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对校园食堂智能排餐系统等问题&#xff0c;对…

Tailwind Classes 我希望早点知道的

以下是一些我希望早点知道的 Tailwind 类&#xff0c;这些类使我的开发过程更加高效&#xff0c;让我的设计更加精致。 line-clamp line-clamp 类在处理多行文本截断时非常有用。它允许你控制显示的文本行数&#xff0c;并截断其余部分。这对于创建一致外观的元素&#xff08;如…

抖音 UG 社招一面算法原题

史上最严热点新机制 或许是受到前段时间「巴黎丢作业」的影响&#xff0c;抖音近日&#xff08;5月27日&#xff09;实施了新的热点内容核实机制。 具体来说&#xff0c;若用户在抖音以热点事件当事人身份发声&#xff0c;抖音将联系当事人进行身份认证。 逾期未认证的用户&…

Flutter开发效率提升1000%,Flutter Quick教程之在特定位置插入Widget

当我们要将Widget插入一个Column,Row或者Listview等有多个子元素的Widget的时候&#xff0c;有两种情况&#xff0c;一种是顺序插入&#xff0c;一种是非顺序插入。顺序插入就是Widget的排列顺序和插入顺序相同&#xff0c;非顺序插入则不是。 一&#xff0c;顺序插入。如图所…

Vue进阶之Vue无代码可视化项目(三)

Vue无代码可视化项目 项目初始化store的使用DataSourceView.vuestores/counter.ts开发模式按钮store/editor.tsLayoutView.vue导航条安装图标iconpackage.jsonstore/debug.tssrc/components/AppNavigator.vueAppNavigator.ts:AppNavigator.vue:theme样式theme/reset.csstheme/v…

重庆耶非凡科技有限公司的选品师项目加盟靠谱吗?

在当今电子商务的浪潮中&#xff0c;选品师的角色愈发重要。而重庆耶非凡科技有限公司以其独特的选品师项目&#xff0c;在行业内引起了广泛关注。对于想要加盟该项目的人来说&#xff0c;项目的靠谱性无疑是首要考虑的问题。 首先&#xff0c;我们来看看耶非凡科技有限公司的背…

【SpringMVC】_设置响应状态码与Header

目录 1. 设置响应状态码 2. 设置响应Header 2.1 设置Content-Type 2.1.1 不使用RequestMapping的produce属性 2.1.2 使用RequestMapping的produce属性 2.2 设置/新增其他Header 1. 设置响应状态码 Spring是基于servlet实现的&#xff0c;设置HTTP响应的状态码可以通过se…

521源码-源码下载-WordPress报错:Allowed memory size of 134217728 bytes exhausted错误解决方法

在wordpress中使用站内搜索或者打开一个页面时提示错误&#xff1a; Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) 致命错误:允许耗尽内存大小为134217728字节(试图分配20480字节) 分析&#xff1a;经过检查发现&#x…

【Ubuntu】【Shell】执行sh脚本报错“xxx.sh:/bin/bash^M:解释器错误: 没有那个文件或目录“

背景 在自己Ubuntu环境执行sh脚本&#xff0c;报错"xxx.sh&#xff1a;/bin/bash^M&#xff1a;解释器错误: 没有那个文件或目录"&#xff0c;查了下是Ubuntu系统默认的shell是dash: 修改配置过下&#xff0c;变成bash 解决方案 在终端执行&#xff1a; sudo dp…

YOLOv8 深度详解!一文看懂,快速上手

YOLOv8 深度详解&#xff01;一文看懂&#xff0c;快速上手 原文&#xff1a;YOLOv8 深度详解&#xff01;一文看懂&#xff0c;快速上手 - 知乎 (zhihu.com) YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本&#xff0c;目前支持图像分类…

处理一对多的映射关系

一对多关系&#xff0c;比如说根据id查询一个部门的部门信息及部门下的员工信息 在Dept类中先添加List emps属性 1、collection DeptMapper.xml文件中 <resultMap id"deptAndEmpResultMap" type"Dept"><id property"did" column&qu…