leetcode 497. 非重疊矩形中的隨機點 - python 解法

https://leetcode-cn.com/probl...python

這道題目很獨特,要求返回隨機的答案,應該是經過檢查答案分佈狀況來判斷是否經過。數組

由於前提是全部矩形不重合。因此能夠分爲兩步作,第一步是隨機選擇矩形,第二步則是在矩形上隨機選點。app

難點在於如何高效的隨機選擇矩形。能夠計算每一個矩形的點數,而後作一個累加的數組,數組第一位是第一個矩形的點數,第 n 位是前 n 個矩形的點數和。dom

而後從 0 到面積和取隨機數,看落到那個矩形上,就選哪一個矩形。能夠使用二分搜索提升效率。code

import bisect
class Solution:

    def __init__(self, rects: List[List[int]]):
        self.r = rects
        self.p = []
        cur = 0
        for r in rects:
            cur += (abs(r[2] - r[0])+1) * (abs(r[3] - r[1])+1)
            self.p.append(cur)

    def pick(self) -> List[int]:
        c = random.randint(0, self.p[-1]-1)
        i = bisect.bisect(self.p, c)
        x = random.randint(self.r[i][0], self.r[i][2])
        y = random.randint(self.r[i][1], self.r[i][3])
        return [x, y]

歡迎來個人博客: https://codeplot.top/
個人博客刷題分類:https://codeplot.top/categories/%E5%88%B7%E9%A2%98/leetcode

相關文章
相關標籤/搜索