2022年5月14日LeetCode双周赛第三题-6068. 毯子覆盖的最多白色砖块数

给定一个二维数组表示白色瓷砖的位置,以及一个毯子的长度,该问题要求找到覆盖最多白色瓷砖的方法。通过排序瓷砖,使用滑动窗口策略,不断更新最大覆盖数。示例展示了如何使用Python和C++代码实现这一过程。
摘要由CSDN通过智能技术生成

6068. 毯子覆盖的最多白色砖块数

难度中等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;
    }
};

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馨馨的小翟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值