记力扣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,0tiles.sort(key=lambda x:x[0])for tl,tr in tiles:cover +=tr-tl+1carpet_left=tr-carpeten+1while tiles[left][1]<carpet_left:cover -=tiles[left][1]-tiles[left][0]left+=1uncover=max(carpet_left-tiles[left][0],0)ans=max(ans,cover-uncover)return ans
难点:
区间覆盖的边界处理
- 难点在于计算
uncover
部分:max(carpet_left - tiles[left][0], 0)
- 这部分需要准确判断当前左边界瓷砖有多少部分不在被地毯覆盖,尤其是当地毯左边界落在某个瓷砖区间中间时
滑动窗口的调整策略
- 如何确定窗口左边界的移动时机:
while tiles[left][1] < carpet_left
- 需要精准判断哪些瓷砖完全不在被当前地毯覆盖,从而从窗口中移除
地毯长度与瓷砖区间的匹配
- 当地毯长度大于多个瓷砖区间总和时的处理
- 当地毯长度小于单个瓷砖区间时的部分覆盖计算
最优解的更新时机
- 每次调整窗口后都需要计算当前有效覆盖长度,并与历史最优解比较
- 这里的有效覆盖长度是
cover - uncover
,而不是简单的cover