Java | Leetcode Java题解之第497题非重叠矩形中的随机点

题目:

题解:

java 复制代码
class Solution {
    Random rand;
    List<Integer> arr;
    int[][] rects;

    public Solution(int[][] rects) {
        rand = new Random();
        arr = new ArrayList<Integer>();
        arr.add(0);
        this.rects = rects;
        for (int[] rect : rects) {
            int a = rect[0], b = rect[1], x = rect[2], y = rect[3];
            arr.add(arr.get(arr.size() - 1) + (x - a + 1) * (y - b + 1));
        }
    }

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

    private int binarySearch(List<Integer> arr, int target) {
        int low = 0, high = arr.size() - 1;
        while (low <= high) {
            int mid = (high - low) / 2 + low;
            int num = arr.get(mid);
            if (num == target) {
                return mid;
            } else if (num > target) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return low;
    }
}
相关推荐
老毛肚3 分钟前
黑马头条 云岚到家
java
江不清丶3 分钟前
垃圾收集算法深度解析:从标记-清除到分代收集的演进之路
java·jvm·算法
副露のmagic5 分钟前
链表章节 leetcode 思路&实现
数据结构·leetcode·链表
码农爱学习5 分钟前
使用cJosn读写配置文件
java·linux·网络
庞轩px6 分钟前
【无标题】
java·开发语言·jvm
Lyyaoo.10 分钟前
【JAVA基础面经】JAVA中的泛型
java
自然常数e14 分钟前
预处理讲解
java·linux·c语言·前端·visual studio
大数据新鸟15 分钟前
设计模式详解——模板方法模式
java·tomcat·模板方法模式
无籽西瓜a16 分钟前
【西瓜带你学设计模式 | 第四期 - 抽象工厂模式】抽象工厂模式 —— 定义、核心结构、实战示例、优缺点与适用场景及模式区别
java·后端·设计模式·软件工程·抽象工厂模式
always_TT22 分钟前
内存泄漏是什么?如何避免?
android·java·开发语言