栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[思维题]leetcode6043:统计包含每个点的矩形数目(medium)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[思维题]leetcode6043:统计包含每个点的矩形数目(medium)

题目:



题解:

本题的横坐标的范围最大达到了 1e9,而纵坐标的范围才 100,所以纵坐标才是本题的突破口。题目实质上问的是对于每一个点 (xi,yi),求横纵坐标都大于等于 xi ,yi 的矩形个数。因此我们把 100 种纵坐标看成 100 行数据,然后将矩形的横坐标装入相应的行中,并使用排序来使行中的横坐标有序。最后我们遍历每一个点 (xi,yi),从 yi 行出发到 100行,使用二分统计这些行中横坐标大于等于 xi 的矩形个数,这样就统计所有横纵坐标大于等于 xi yi 的举行个数了。


代码如下:

class Solution {
public:
    // 由于纵坐标只有100种,可以看成100行数据,然后记录这100行的矩形的横坐标
    // 这样对于每一个点(xi,yi),我们仅需使用二分统计[yi,100]内横坐标大于等于xi的矩形个数,然后进行累加即可
    vector countRectangles(vector>& r, vector>& p) {   
        vector lines[101];
        // 将所有矩形的坐标存入lines
        for(auto &it:r)lines[it[1]].push_back(it[0]);
        // 将每一行的横坐标进行排序,便于二分查找
        for(auto &l:lines)sort(l.begin(),l.end());

        int n=p.size();
        vector res(n,0);
        // 开始统计每个点,在每一行中的矩形个数
        for(int i=0;i
                auto& line=lines[j];
                // 累加第j行中横坐标大于等于p[i][0]的个数
                res[i]+=line.end()-lower_bound(line.begin(),line.end(),p[i][0]);
            }
                
        return res;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928503.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号