• 入门力扣自学笔记74 C++ (题目编号710)(未理解)


    710. 黑名单中的随机数

    题目:

    给定一个整数 n 和一个 无重复 黑名单整数数组 blacklist 。设计一种算法,从 [0, n - 1] 范围内的任意整数中选取一个 未加入 黑名单 blacklist 的整数。任何在上述范围内且不在黑名单 blacklist 中的整数都应该有 同等的可能性 被返回。

    优化你的算法,使它最小化调用语言 内置 随机函数的次数。

    实现 Solution 类:

    Solution(int n, int[] blacklist) 初始化整数 n 和被加入黑名单 blacklist 的整数
    int pick() 返回一个范围为 [0, n - 1] 且不在黑名单 blacklist 中的随机整数


    示例 1:

    输入
    ["Solution", "pick", "pick", "pick", "pick", "pick", "pick", "pick"]
    [[7, [2, 3, 5]], [], [], [], [], [], [], []]
    输出
    [null, 0, 4, 1, 6, 1, 0, 4]

    解释
    Solution solution = new Solution(7, [2, 3, 5]);
    solution.pick(); // 返回0,任何[0,1,4,6]的整数都可以。注意,对于每一个pick的调用,
                     // 0、1、4和6的返回概率必须相等(即概率为1/4)。
    solution.pick(); // 返回 4
    solution.pick(); // 返回 1
    solution.pick(); // 返回 6
    solution.pick(); // 返回 1
    solution.pick(); // 返回 0
    solution.pick(); // 返回 4


    提示:

    1 <= n <= 109
    0 <= blacklist.length <= min(105, n - 1)
    0 <= blacklist[i] < n
    blacklist 中所有值都 不同
     pick 最多被调用 2 * 104 次


    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/random-pick-with-blacklist
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    思路:

    请大佬移步到官方题解。


    代码:

    1. class Solution {
    2. unordered_map<int, int> b2w;
    3. int bound;
    4. public:
    5. Solution(int n, vector<int> &blacklist) {
    6. int m = blacklist.size();
    7. bound = n - m;
    8. unordered_set<int> black;
    9. for (int b: blacklist) {
    10. if (b >= bound) {
    11. black.emplace(b);
    12. }
    13. }
    14. int w = bound;
    15. for (int b: blacklist) {
    16. if (b < bound) {
    17. while (black.count(w)) {
    18. ++w;
    19. }
    20. b2w[b] = w++;
    21. }
    22. }
    23. }
    24. int pick() {
    25. int x = rand() % bound;
    26. return b2w.count(x) ? b2w[x] : x;
    27. }
    28. };
    29. /**
    30. * Your Solution object will be instantiated and called as such:
    31. * Solution* obj = new Solution(n, blacklist);
    32. * int param_1 = obj->pick();
    33. */

  • 相关阅读:
    Spring的事务管理机制
    字符串-模板编译
    [ABC286D] Money in Hand(背包--必须刚好装满--物品数量有限--题型)
    深度学习系列53:mmdetection上手
    linux升级openssh9
    SpringBoot集成mysql-connector-java数据库驱动
    C语言的由来与发展历程
    薅羊毛必备之-------青龙面板白嫖京东
    CH573-09-BLE蓝牙安卓应用二次开发——RISC-V内核BLE MCU快速开发教程
    神经网络计算相似度,神经网络对比
  • 原文地址:https://blog.csdn.net/DK_Sorhic/article/details/125467788