Random Point in Non-overlapping Rectangles

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;
};

[1]https://www.cnblogs.com/grandyang/p/9752145.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值