记力扣2271.毯子覆盖的最多白色砖块数 练习理解

给你一个二维整数数组 tiles ,其中 tiles[i] = [li, ri] ,表示所有在 li <= j <= ri 之间的每个瓷砖位置 j 都被涂成了白色。

同时给你一个整数 carpetLen ,表示可以放在 任何位置 的一块毯子的长度。

请你返回使用这块毯子,最多 可以盖住多少块瓷砖。

思路:

先将列表按元素第一个数字大小顺序排序(tiles.sort(key:lambda x:x[0]),接着开始遍历,算出每一个列表的长度,然后通过carpet_left=该列表右端点长减去毯子长 +1 算 出毯子左端点的位置,然后去判断第一个列表的右端点是否小于毯子左端点如果成立则需要剔除该列表的长度,达到合适的有效毯子覆盖,然后算出不被覆盖的最大长度,然后结果就是max(ans,cover-uncover),前面算的是完全不在范围内的列表长度,最后还需把部分重叠的减去才是最终的结果

复制代码
from typing import List
class Solution:
    def maximumWhiteTiles(self,tiles:List[int],carpeten:int)->int:
        ans,cover,left=0,0,0
        tiles.sort(key=lambda x:x[0])
        for tl,tr in tiles:
            cover +=tr-tl+1
            carpet_left=tr-carpeten+1
            while tiles[left][1]<carpet_left:
                cover -=tiles[left][1]-tiles[left][0]
                left+=1
            uncover=max(carpet_left-tiles[left][0],0)
            ans=max(ans,cover-uncover)
        return ans

难点:

  1. 区间覆盖的边界处理

    • 难点在于计算uncover部分:max(carpet_left - tiles[left][0], 0)
    • 这部分需要准确判断当前左边界瓷砖有多少部分不在被地毯覆盖,尤其是当地毯左边界落在某个瓷砖区间中间时
  2. 滑动窗口的调整策略

    • 如何确定窗口左边界的移动时机:while tiles[left][1] < carpet_left
    • 需要精准判断哪些瓷砖完全不在被当前地毯覆盖,从而从窗口中移除
  3. 地毯长度与瓷砖区间的匹配

    • 当地毯长度大于多个瓷砖区间总和时的处理
    • 当地毯长度小于单个瓷砖区间时的部分覆盖计算
  4. 最优解的更新时机

    • 每次调整窗口后都需要计算当前有效覆盖长度,并与历史最优解比较
    • 这里的有效覆盖长度是cover - uncover,而不是简单的cover
相关推荐
冷雨夜中漫步6 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴6 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再6 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
盐焗西兰花7 小时前
鸿蒙学习实战之路-Reader Kit修改翻页方式字体大小及行间距最佳实践
学习·华为·harmonyos
颜酱7 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
QiZhang | UESTC7 小时前
学习日记day76
学习
久邦科技7 小时前
20个免费电子书下载网站,实现电子书自由(2025持续更新)
学习
m0_736919108 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi9878388 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
喵手8 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控