1.解析
题目大意,给定不重叠的多个矩形,随机产生所有矩形当中的某个点。
2.分析
这道题整体上还是比较难的,主要参考Grandyang的思路。难点在于在多个矩形当中选择矩形,可以考虑将每个矩形的面积作为该矩形对应的权重,如果矩形面积很大,意味着选择该矩形内的点的概率就大。因为是以矩形内点的个数作为权重,所以计算的时候,要加1。整体上可以分成以下两个步骤:
①根据权重选择矩形:以每个矩形包含点的个数作为权重,将其累加起来,建立累加值数组,例如,第一个矩形包含5个点,第二个矩形包含6个点,那hashtable存储的值为:5, 11。如果生成6-10,则意味选择第二个矩形。
②在矩形内选择随机点:左下角的坐标,加上随机生成的长和宽的长度
class Solution {
public:
Solution(vector<vector<int>>& rects) {
this->rects = rects;
allArea = 0;
for (auto rect : rects){
allArea += (rect[2]-rect[0]+1) * (rect[3]-rect[1]+1); //以矩形内点的个数作为权重大小
record.insert({allArea, record.size()});
}
}
vector<int> pick() {
int area = rand() % allArea;
int select = record.upper_bound(area)->second;
int length = rects[select][2] - rects[select][0] + 1; //选择矩形长所包含点的个数
int width = rects[select][3] - rects[select][1] + 1; //选择矩形宽所包含点的个数
return vector<int>{rects[select][0] + rand() % length, rects[select][1] + rand() % width};
}
vector<vector<int>> rects;
int allArea;
map<int, int> record;
};