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

276 阅读2分钟

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • 1 <= rects.length <= 100
    • rects[i].length == 4
    • 109 <= ai < xi <= 109
    • 109 <= bi < yi <= 109
    • xi - ai <= 2000
    • yi - bi <= 2000
    • 所有的矩形不重叠。
    • pick 最多被调用 104 次

二、思路分析:

我们读取本题,题目要求我们在矩形中随机生成一个左边点。从题目中了解到几点信息:

  • 矩形个数范围在1~100个
  • 矩形之间不存在重叠矩形

image.png

我们根据题目,可以采取前缀+二分法来实现,思路如下:

  • 首先根据rects,求出所有的矩形面积S,并用列表存储每一个矩形的面积
  • 因为矩形都给出两个坐标:左小角(a,b),右上角(x,y)
  • 因此矩形的面积(x-a+1)*(y-b+1)
  • 先在面积和中随机生成一个K,找到具体的矩形编号
  • 确定矩形编号时,可以采用预处理前缀和和二分搜索的方式

如上思路,我们使用python实现代码如下:

class Solution(object):

    def __init__(self, rects):
        """
        :type rects: List[List[int]]
        """
        self.rects = rects
        self.s = [0]*(len(rects)+1)
        for idx,rect in enumerate(self.rects):
            a,b,x,y = rect[0],rect[1],rect[2],rect[3]
            self.s[idx+1] = self.s[idx] + (x-a+1)*(y-b+1)

    def pick(self):
        """
        :rtype: List[int]
        """
        k = randrange(self.s[-1])
        reindex = bisect_right(self.s,k)-1
        a, b, _, y = self.rects[reindex]
        da, db = divmod(k - self.s[reindex], y - b + 1)
        return [a + da, b + db]

三、总结:

本期考察我们使用前缀法来记录矩形的范围,最后仍然通过矩形面积来逆向推导出随机点坐标,AC记录如下:

image.png

  • 时间复杂度:构造函数复杂度为 O(n),pick函数复杂度O(logn)
  • 空间复杂度:构造函数复杂度为 O(n),pick 函数复杂度为 O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~