【Day26】LeetCode:452. 用最少数量的箭引爆气球,435. 无重叠区间,763. 划分字母区间

文章目录

  • [LeetCode:452. 用最少数量的箭引爆气球](#LeetCode:452. 用最少数量的箭引爆气球)
  • [LeetCode:435. 无重叠区间](#LeetCode:435. 无重叠区间)
  • [LeetCode:763. 划分字母区间](#LeetCode:763. 划分字母区间)

LeetCode:452. 用最少数量的箭引爆气球

https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/

思路

  1. 将所有区间按照 xend 从小到大排列。
  2. 第一支箭射在第一个区间的右端点。
  3. 遍历后续区间:
    (1)如果当前区间的左端点 xstart 大于上一支箭的位置,说明这支箭无法射中当前气球,必须发射一支新箭,并将新箭的位置设为当前区间的右端点。
    (2)否则,当前区间可以被上一支箭覆盖,无需新箭。

解答

python 复制代码
class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        points.sort(key=lambda x: x[1]) # 按区间右端点升序排序
        
        arrows = 1
        current_end = points[0][1]  # 第一支箭的位置
        
        for xstart, xend in points[1:]:
            if xstart > current_end: # 如果当前气球左端点 > 上一支箭的位置,需要新箭
                arrows += 1
                current_end = xend
        
        return arrows

LeetCode:435. 无重叠区间

https://leetcode.cn/problems/non-overlapping-intervals/

思路

贪心时选择最早结束的区间,可以最大化剩余空间,使得后续有更多区间可能被容纳。

解答

python 复制代码
class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        intervals.sort(key=lambda x: x[1]) # 按区间右端点升序排序
        
        last_end = intervals[0][1]
        remain = 1 # 至少保留一个

        for start, end in intervals[1:]:
            if start >= last_end: # 不重叠,保留
                remain += 1
                last_end = end
        
        return len(intervals) - remain

LeetCode:763. 划分字母区间

https://leetcode.cn/problems/partition-labels/

思路

  1. 第一次遍历:记录每个字符在字符串中最后出现的索引。
  2. 第二次遍历:
    (1)初始化 start = 0end = 0
    (2)遍历每个字符 s[i],更新 end = max(end, last_index[s[i]]),表示当前片段必须延伸到当前字符的最后出现位置。
    (3)当 i == end 时,说明从 startend 的片段已经包含了所有出现的字符,且不会与后面的片段冲突,因此可以切分。记录长度 end - start + 1,然后将 start 更新为 i + 1

解答

python 复制代码
class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        # 统计每一个字符最后出现的位置
        last_index = {}
        n = len(s)
        for i in range(n):
            last_index[s[i]] = i
        
        results = []
        start = 0
        end = 0
        for i in range(n):
            end = max(end, last_index[s[i]])
            if i == end:
                results.append(end - start + 1)
                start = i + 1
        return results
相关推荐
GuWenyue2 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
想会飞的蒲公英3 小时前
计算机怎样读取中文文本:编码、清洗与标准化
人工智能·python·自然语言处理
我叫洋洋3 小时前
C ++ [ hello world ]
c语言·c++·算法
SeaTunnel4 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
深度研习笔记4 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
CCPC不拿奖不改名4 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github
奋发向前wcx4 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
Marst Code5 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
databook5 小时前
当散点图不够用时:用 t-SNE 可视化多维数据
python·数据分析·数据可视化
我的xiaodoujiao7 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具