710.leetcode題目講解(Python):黑名單中的隨機數(Random Pick with Blacklist)

題目

解題思路

這道題的我的主要思路是,先通過累積概率選出各個白名單區間,然後再在白名單區間內生成隨機數。網上也有一些其他更好的解法,比如對黑名單的成員進行映射等等,但思路不是特別直觀,有些解法生成隨機數的概率也並不均勻。

參考代碼

import random
import bisect


class Solution:
    def __init__(self, N, blacklist):
        self.N = N - 1
        self.black = sorted(blacklist)
        self.range = []
        self.weight = []
        self.blacklen = len(self.black)
        if self.blacklen:
            s = 0
            for r in self.black:
                if r - s >= 1:
                    self.range.append([s, r - 1])
                s = r + 1
            if s < self.N + 1:
                self.range.append([s, self.N])

            weight = 0
            for r in self.range:
                weight = weight + r[1] - r[0] + 1
                self.weight.append(weight)

    def pick(self) -> int:
        if self.blacklen:
            r = self.range[bisect.bisect_left(
                self.weight, random.randint(1, self.weight[-1]))]
            return random.randint(r[0], r[1]) if r[1] > r[0] else r[0]

        else:
            return random.randint(0, self.N)

源碼地址:
https://github.com/jediL/LeetCodeByPython

其它題目:[leetcode題目答案講解彙總(Python版 持續更新)]
(https://www.jianshu.com/p/60b5241ca28e)

ps:如果您有好的建議,歡迎交流 :-D,
也歡迎訪問我的個人博客 苔原帶 (www.tundrazone.com)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章