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

leetcode3_435 and 605

leetcode学习算法之贪心算法:

  1. 无重叠区间
  2. 种花问题

435. 无重叠区间-题目描述
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
注意 只在一点上接触的区间是 不重叠的。例如 [1, 2] 和 [2, 3] 是不重叠的。

示例 :
输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。

代码

class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:intervals.sort(key = lambda x: x[1])removed, prev_end = 0, intervals[0][1]for i in range(1, len(intervals)):if prev_end > intervals[i][0]:removed += 1else:prev_end = intervals[i][1]return removed

调用测试

intervals = [[1,2],[2,3],[3,4],[1,3]]
# 创建 Solution 类的实例
solution = Solution()
# 调用方法
result = solution.eraseOverlapIntervals(intervals)
# 输出结果
print("你需要移除", result, "个区间")

这一题直接使用作者书里面的源代码进行解题。
贪心策略是:按照右端点从小到大排序,每次保留右端点最小且不与前一个保留区间重叠的区间,遇到重叠就删除当前区间(即不更新 prev_end)。

605. 种花问题-题目描述
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。

示例 :
输入:flowerbed = [1,0,0,0,1], n = 1
输出:true

代码

class Solution:def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:# 判断第一个位置和最后一个if len(flowerbed) >1 :if flowerbed[0] == 0 and flowerbed[1] == 0:n = n - 1flowerbed[0] = 1if flowerbed[-1] == 0 and flowerbed[-2] == 0:n = n - 1flowerbed[-1] = 1else:if flowerbed[0] == 0:n = n - 1flowerbed[0] = 1for i in range(1, len(flowerbed) - 1):if flowerbed[i - 1] == 0 and flowerbed[i] == 0 and flowerbed[i + 1] == 0:n = n -1flowerbed[i] = 1if n > 0:return Falseelse:return True

完整代码

from typing import List
class Solution:def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:# 判断第一个位置和最后一个if len(flowerbed) >1 :if flowerbed[0] == 0 and flowerbed[1] == 0:n = n - 1flowerbed[0] = 1if flowerbed[-1] == 0 and flowerbed[-2] == 0:n = n - 1flowerbed[-1] = 1else:if flowerbed[0] == 0:n = n - 1flowerbed[0] = 1for i in range(1, len(flowerbed) - 1):if flowerbed[i - 1] == 0 and flowerbed[i] == 0 and flowerbed[i + 1] == 0:n = n -1flowerbed[i] = 1if n > 0:return Falseelse:return True
flowerbed = [0,0,0,0,1]
n = 2
# 创建 Solution 类的实例
solution = Solution()
# 调用方法
result = solution.canPlaceFlowers(flowerbed, n)
# 输出结果
print("你需要移除", result, "个区间")

这一题自己的想法是:通过从左至右判断列表中的节点是否满足要求,满足要求就对n进行减法。最后判断n是否小于1确实种入n朵花。
原来的代码是先判断列表除第一个和最后一个节点是否满足,最处理列表的第一个和最后一个节点,但是存在部分测试用例不同通过。后面调整代码为先判断第一个节点,测试用例全部通过。我犯错的原因是没有严格从左到右处理,而是先处理中间节点。此外,要注意列表长度是否大于1,否则遍历两个节点时出现超出范围。

http://www.xdnf.cn/news/1151155.html

相关文章:

  • 【Linux服务器】-zabbix通过proxy进行分级监控
  • 子线程不能直接 new Handler(),而主线程可以
  • sql练习二
  • 打靶日记之xss-labs
  • OpenCV 官翻 4 - 相机标定与三维重建
  • 如何设计一个软件项目管理系统:架构设计合集(六)
  • 小明记账簿焕新记:从单色到多彩的主题进化之路
  • Java并发8--并发安全容器详解
  • Springboot项目的搭建方式5种
  • Tomcat 生产 40 条军规:容量规划、调优、故障演练与安全加固
  • day25 力扣90.子集II 力扣46.全排列 力扣47.全排列 II
  • LVS(Linux virual server)
  • windows内核研究(驱动开发-0环与3环的通信)
  • Kotlin泛型约束
  • 多表查询-8-练习总结
  • 数据库练习3
  • Flowable31动态表单-----------------------终章
  • 博图SCL语言中常用运算符使用详解及实战案例(下)
  • OpenCV 官翻 3 - 特征检测 Feature Detection
  • 【无标题】重点阅读——如何在信息层面区分和表征卷曲维度,解析黑洞内部的维度区分机制
  • 《命令行参数与环境变量:从使用到原理的全方位解析》
  • 搭建比分网服务器怎么选数据不会卡顿?
  • lvs原理及实战部署
  • 【I2C】01.I2C硬件连接I2C总线时序图讲解
  • Go语言pprof性能分析指南
  • Temperature 是在LLM中的每一层发挥作用,还是最后一层? LLM中的 Temperature 参数 是怎么计算的
  • 操作系统-分布式同步
  • TCP/UDP协议深度解析(四):TCP的粘包问题以及异常情况处理
  • GaussDB 数据库架构师修炼(六) 集群工具管理-1
  • 异步解决一切问题 |消息队列 |减少嵌套 |hadoop |rabbitmq |postsql