Leetcode 2250. Count Number of Rectangles Containing Each Point

该博客详细介绍了LeetCode第2250题的解决方案,重点在于使用二分搜索算法。首先,作者指出尝试分别对长和宽进行二分搜索的思路是错误的,因为长和宽不能独立考虑。接着,作者提出了一种次优解法,即通过找到一边的下边界然后遍历剩余情况,但这种方法在最坏情况下时间复杂度为n^2,会导致超时。最终,作者提供了一个正确的解决方案,即创建一个以高度为键,对应所有宽度为值的数据结构,并对宽度进行排序。在查询每个点时,对每个可能的高度执行二分搜索。作者还注意到,直接遍历整个数据结构会超时,而使用有序的容器(如vector)可以显著提高效率。
摘要由CSDN通过智能技术生成

题目

在这里插入图片描述
在这里插入图片描述

解法:二分搜索

这道题目的关键在于利用这些长方形的长宽范围。
想到二分搜索是很容易的,问题在于如何搜索。
阶段1:一开始想到的解法是通过长方形的长度和宽度分别进行二分搜索,但是这样的想法是不对的。这种想法是对长方形拷贝两份,一份按照长度排序,一份按照宽度排序,然后分别找长度和宽度的下边界,从两个下边界的最小值作为某一个点的答案,但是这样的想法很容易举出反例,比如如果长方形list是:[[1,2],[100,3],[4,8],[200,1],[400,1]],可以发现这么做是不对的,所以一个长方形的长和宽是必须放在一起check的,无法剥离
阶段2: 想到了利用长或者宽找到一边的下边界,然后便利剩余的case,但是这样的最差的复杂度还是n^2的,比如如果进行二分搜索的长或者宽全部符合条件,那么相当于二分搜索没有起到效果,所以这种解法会tle
这种解法如下:

class Solution {
   
public:
    int binary_search(int target,vector<vector<int>> recs){
   
        int left = 0;
        if(recs[0][0] >= target) return 0;
        int right = recs.size();
        while(left + 1 < right){
   
            int mid = left + (right - left) / 2;
            if(recs[mid][0] >= target){
   
                right = mid;
            }else{
   
                left = mid;
            }
        }
        return right;
        
    }
    static bool comparer(vector<int> a, vector<int> b){
   
        return a[0] <= b[0];
    }
    vector<int> countRectangles(vector<vector<int>>& rectangles, vector<vector<int>>& points) {
   
        sort(rectangles.begin(),rectangles.end(),comparer);
        vector<<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值