日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 497. 非重叠矩形中的随机点(前缀和+二分查找)

發布時間:2024/7/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 497. 非重叠矩形中的随机点(前缀和+二分查找) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

給定一個非重疊軸對齊矩形的列表 rects,寫一個函數 pick 隨機均勻地選取矩形覆蓋的空間中的整數點。

提示: 整數點是具有整數坐標的點。 矩形周邊上的點包含在矩形覆蓋的空間中。 第 i 個矩形 rects [i] = [x1,y1,x2,y2],其中 [x1,y1] 是左下角的整數坐標,[x2,y2] 是右上角的整數坐標。 每個矩形的長度和寬度不超過 20001 <= rects.length <= 100 pick 以整數坐標數組 [p_x, p_y] 的形式返回一個點。 pick 最多被調用10000次。示例 1: 輸入: ["Solution","pick","pick","pick"] [[[[1,1,5,5]]],[],[],[]] 輸出: [null,[4,1],[4,1],[3,3]]示例 2: 輸入: ["Solution","pick","pick","pick","pick","pick"] [[[[-2,-2,-1,-1],[1,0,3,0]]],[],[],[],[],[]] 輸出: [null,[-1,-2],[2,0],[-2,-1],[3,0],[-2,-2]]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/random-point-in-non-overlapping-rectangles
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

類似題目:
LeetCode 528. 按權重隨機選擇(前綴和+二分查找)

  • 按照總的點的個數均勻分配
  • 計算每個矩形的點的個數,以及點個數的前綴和
  • 二分查找查找隨機到的點所在的矩形,在該矩形內找到點的偏移位置
class Solution {int n; //矩形個數int total;//總的點的個數int pointId;//選取的點的idvector<int> presum;//所有矩形點的個數的前綴和vector<vector<int>> rectsize;//矩形的高,寬vector<vector<int>> rects;//矩形 public:Solution(vector<vector<int>>& rects) {n = rects.size();presum.resize(n);rectsize.resize(n);this->rects = rects;int r, c;for(int i = 0; i < n; ++i){r = rects[i][3]-rects[i][1]+1;//高c = rects[i][2]-rects[i][0]+1;//寬rectsize[i] = {r, c};presum[i] = r*c+(i>0 ? presum[i-1] : 0);//點個數的前綴和}total = presum.back();}vector<int> pick() {pointId = rand()%total + 1;//隨機點int L = 0, R = n-1, mid, rectID;// 二分查找 presum, 找到第一個 presum >= pointId 的矩形的IDwhile(L <= R){mid = L+((R-L)>>1);if(presum[mid] < pointId)L = mid+1;else{if(mid==0 || presum[mid-1] < pointId){rectID = mid;//找到該點所在的矩形IDbreak;}elseR = mid-1;}}// idx 是該點在矩形內的idint idx = pointId - (rectID > 0 ? presum[rectID-1] : 0) - 1; // 讀取 矩形的 高, 寬int r = rectsize[rectID][0], c = rectsize[rectID][1];// 計算 相對左下角的偏移量int x = idx%c, y = idx/c;return {rects[rectID][0]+x, rects[rectID][1]+y};} };

84 ms 63.2 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 497. 非重叠矩形中的随机点(前缀和+二分查找)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。