首页 > 其他分享 >497. 非重叠矩形中的随机点 ( presum+二分)

497. 非重叠矩形中的随机点 ( presum+二分)

时间:2022-08-25 21:12:22浏览次数:64  
标签:二分 area int Solution pick rects presum 497 rect

 

难度中等

给定一个由非重叠的轴对齐矩形的数组 rects ,其中 rects[i] = [ai, bi, xi, yi] 表示 (ai, bi) 是第 i 个矩形的左下角点,(xi, yi) 是第 i 个矩形的右上角点。设计一个算法来随机挑选一个被某一矩形覆盖的整数点。矩形周长上的点也算做是被矩形覆盖。所有满足要求的点必须等概率被返回。

在给定的矩形覆盖的空间内的任何整数点都有可能被返回。

请注意 ,整数点是具有整数坐标的点。

实现 Solution 类:

  • Solution(int[][] rects) 用给定的矩形数组 rects 初始化对象。
  • int[] pick() 返回一个随机的整数点 [u, v] 在给定的矩形所覆盖的空间内。

 

示例 1:

输入: 
["Solution", "pick", "pick", "pick", "pick", "pick"]
[[[[-2, -2, 1, 1], [2, 2, 4, 6]]], [], [], [], [], []]
输出: 
[null, [1, -2], [1, -1], [-1, -2], [-2, -2], [0, 0]]

解释:
Solution solution = new Solution([[-2, -2, 1, 1], [2, 2, 4, 6]]);
solution.pick(); // 返回 [1, -2]
solution.pick(); // 返回 [1, -1]
solution.pick(); // 返回 [-1, -2]
solution.pick(); // 返回 [-2, -2]
solution.pick(); // 返回 [0, 0]

 

class Solution {
public:
    vector<int> pre_area = {0};
    vector<vector<int>> rects;
    Solution(vector<vector<int>>& rects) {
        this->rects = rects;
        for(auto rect: rects) {
            int area = pre_area.back() + (rect[2] - rect[0]+1) * (rect[3] - rect[1]+1);
            pre_area.emplace_back(area);
        }
    }
    int find_right(vector<int>& pre_area,int target) {
        int low = 0, high = pre_area.size();
        while(low < high) {
            int mid = low + (high - low) / 2;
            if (pre_area[mid] < target) {
                low = mid + 1;
            } else {
                high = mid;
            }
        }
        return low;
    }
    vector<int> pick() {
        int tt = rand()% pre_area.back() + 1;
        int index_a = find_right(pre_area,tt);
        auto rect = rects[index_a-1];
        //   rand() % (b-a+1)+ a ;    就表示  a~b 之间的一个随机整数   
        int res1 = rand() % (rect[2]-rect[0]+1)+ rect[0];
        int res2 = rand() % (rect[3]-rect[1]+1)+ rect[1];
        vector<int> res = {res1,res2};
        return res;
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* obj = new Solution(rects);
 * vector<int> param_1 = obj->pick();
 */

 

标签:二分,area,int,Solution,pick,rects,presum,497,rect
From: https://www.cnblogs.com/zle1992/p/16625706.html

相关文章

  • 2022-8-25 剑指offer-字典树-每日一题-二分/排序
    剑指OfferII063.替换单词难度中等25收藏分享切换为英文接收动态反馈在英语中,有一个叫做 词根(root) 的概念,它可以跟着其他一些词组成另一个较长的单词——我......
  • 二分法基本思路和实现
    二分法基本思路和实现作者:Grey原文地址:博客园:二分法基本思路和实现CSDN:二分法基本思路和实现在一个有序数组中,找某个数是否存在OJ见:LeetCode704.BinarySearch......
  • 二分查找法
    使用二分查找的条件:有序数组需求在数组{1,2,3,4,5,6,7,8,9,10}中,查找某个元素的位置实现步骤定义两个变量,表示要查找的范围。默认min=0,max=最大索引......
  • 【Java基础】数组中的常见算法:二分查找算法
    1.实现二分查找算法要求数组必须是有序的。把中间的值和要查询的值进行比较,相等则返回索引下标arr[middle]>number,则让尾索引等于middle-1,arr[middle]<number,则让开始......
  • 二分、三分、01分数规划
    二分、三分、01分数规划二分查找单调函数求零点二分查找:在一个单调有序的集合中查找元素,每次将集合分为左右两个部分,判断解在哪个部分中并调整集合上下界,重复直到找到目......
  • 复杂度分析、排序算法、二分法、堆的上调和下调
    1.认识复杂度与排序算法复杂度:认识时间复杂度就是看进行了多少次常数操作。(什么是常数操作?赋值、加减乘除运算等都是。调用API操作就不是如list.get(i)。)时间复杂度:在......
  • AcWing算法基础课---第一讲基础算法---02二分
    整数二分模板l=mid这个模板mid需要+1intbsearch_1(intl,intr){while(l<r){intmid=l+r>>1;if(check(mid))r=mid;//check()判断mid是否满足性......
  • 二分查找
    二分查找二分查找分为整数二分和小数二分,其中整数二分涉及的边界问题比较多,理解起来相对复杂。#整数二分如果可以找到一个性质,可以把区间一分为二,一半满足性质一半不......
  • 学习笔记——wqs 二分
    前言前情提要概论这类问题的特点是,本来不需要求代价,我却二分出一个代价从而间接的满足题目中的某些限制。最显著的标志,就是⌈恰好选\(k\)个⌋的限制。这样说比较抽......
  • 【2022牛客多校】第五场 Crazy Thursday 二分+字符串哈希
    https://ac.nowcoder.com/acm/contest/33190/G题意给你一个长为n的字符串s,求s中分别以'k'、'f'、'c'结尾的回文串数量\(n<=5e5\)思路首先暴力枚举区间端点加判断,为......