当前位置: 首页 > 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.dtcms.com/a/287617.html

相关文章:

  • 在服务器(ECS)部署 MySQL 操作流程
  • C++控制台贪吃蛇开发:从0到1绘制游戏世界
  • Linux --进程信号
  • 2025年燃气从业人员证考试题库及答案
  • Linux——文件压缩和解压
  • 结合python面向对象编程,阐述面向对象三大特征
  • volka 可理解性输入:做家务
  • 学习C++、QT---29(QT库中QT事件的介绍和用了几个案例来对事件怎么使用的讲解)
  • lvs原理及实战部署
  • Linux内核设计与实现 - 第5章 系统调用
  • CS231n-2017 Lecture3线性分类器笔记
  • 什么是 Git 的钩子 Hooks?包括哪些内容?
  • picoCTF 2024: [[NoSQL]] Injection - Writeup
  • K8s与Helm实战:从入门到精通
  • 【杂谈】硬件工程师怎么用好AI工具做失效分析
  • 图像缩放的双线性插值算法
  • Keepalived 监听服务切换与运维指南
  • Redis常见线上问题
  • 如何实现电脑自动关机与定时任务管理
  • MySQL 深度性能优化配置实战指南
  • UGUI 性能优化系列:第三篇——渲染与像素填充率优化
  • Redis性能测试全攻略:工具实操与性能优化指南
  • python conda 包管理工具 隔离环境
  • Ubuntu 22.04.3 LTS 安装 MySQL
  • 【数据结构初阶】--双向链表(二)
  • 基于单片机病床呼叫系统/床位呼叫系统
  • 【自用】JavaSE--集合框架(一)--斗地主案例
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现动物分类(C#源码,UI界面版)
  • Python 常见库分类介绍及安装方法
  • 数据库第四次作业