题目
解法:二分搜索
这道题目的关键在于利用这些长方形的长宽范围。
想到二分搜索是很容易的,问题在于如何搜索。
阶段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<<