497. 非重叠矩形中的随机点

import java.util.ArrayList;
import java.util.Random;

class Solution {
    
    public ArrayList<Integer> arr;
    public int[][] rects;
    public Random random;

    public Solution(int[][] rects) {
        arr = new ArrayList<>();
        this.rects = rects;
        random = new Random();
        arr.add(0);
        for (int[] rect : rects) {
            int pointNum = (rect[2] - rect[0] + 1) * (rect[3] - rect[1] + 1);
            //前缀和
            arr.add(arr.get(arr.size() - 1) + pointNum);
        }
    }

    public int[] pick() {
        int k = random.nextInt(arr.get(arr.size() - 1));
        int indexRect = binarySearch(k) - 1;
        int[] rect = rects[indexRect];
        k -= arr.get(indexRect);
        int a = rect[0], b = rect[1], y = rect[3];
        int col = y - b + 1;
        int da = k / col;
        int db = k - da * col;
        return new int[]{a + da, b + db};
    }

    public int binarySearch(int target) {
        int left = 0;
        //right = rect个数
        int right = arr.size() - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (arr.get(mid) > target) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
}

/**
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(rects);
 * int[] param_1 = obj.pick();
 */
posted @ 2022-06-09 11:59  求索萌新  阅读(16)  评论(0)    收藏  举报