难度中等4收藏分享切换为英文接收动态反馈
给你一个二维整数数组 tiles
,其中 tiles[i] = [li, ri]
,表示所有在 li <= j <= ri
之间的每个瓷砖位置 j
都被涂成了白色。
同时给你一个整数 carpetLen
,表示可以放在 任何位置 的一块毯子。
请你返回使用这块毯子,最多 可以盖住多少块瓷砖。
示例 1:
输入:tiles = [[1,5],[10,11],[12,18],[20,25],[30,32]], carpetLen = 10 输出:9 解释:将毯子从瓷砖 10 开始放置。 总共覆盖 9 块瓷砖,所以返回 9 。 注意可能有其他方案也可以覆盖 9 块瓷砖。 可以看出,瓷砖无法覆盖超过 9 块瓷砖。
示例 2:
输入:tiles = [[10,11],[1,1]], carpetLen = 2 输出:2 解释:将毯子从瓷砖 10 开始放置。 总共覆盖 2 块瓷砖,所以我们返回 2 。
提示:
1 <= tiles.length <= 5 * 104
tiles[i].length == 2
1 <= li <= ri <= 109
1 <= carpetLen <= 109
tiles
互相 不会重叠 。
通过次数1,719提交次数7,860
题意:
滑动窗口,不停的判断当前区间的满足要求吗?
如果没超过毯子的覆盖范围,则访问下一个区间继续,如果超过了则取最后一个区间内毯子的长度
左区间也得不停的维护
Python代码:
class Solution:
def maximumWhiteTiles(self, tiles: List[List[int]], carpetLen: int) -> int:
tiles.sort()#数组排序
ans , j , cout = 0 , 0 , 0
for i in range(len(tiles)):
while j<len(tiles) and (tiles[j][1]+1-tiles[i][0]<=carpetLen):
cout += (tiles[j][1] - tiles[j][0] + 1)#如果还没超过毯子,那么累加
j += 1#右区间右移
if j<len(tiles): #如果毯子不够长了,那么久加上最后一个区间内毯子占的长度
ans = max(ans , cout+max(0 , carpetLen-(tiles[j][0] - tiles[i][0])))
else:
ans = max(ans , cout) #说明毯子覆盖全部区间了,直接取最大
cout -= tiles[i][1] - tiles[i][0] + 1 #左区间右移
return ans
C++代码:
class Solution {
public:
int maximumWhiteTiles(vector<vector<int>>& tiles, int carpetLen) {
sort(tiles.begin() , tiles.end());
int j=0 , ans=0 , cout = 0;
for(int i=0; i<tiles.size(); i++){
while(j<tiles.size() && (tiles[j][1] - tiles[i][0] + 1)<=carpetLen){
cout += tiles[j][1] - tiles[j][0] + 1;
j++;
}
if (j<tiles.size()) {
ans = max(ans , cout + max(0 , tiles[i][0] + carpetLen - tiles[j][0]));
}
else ans = max(ans , cout);
cout -= tiles[i][1] - tiles[i][0] + 1;
}
return ans;
}
};