当前位置: 首页 > article >正文

(leetcode算法题)382. 链表随机节点

如果给你一个 智能记录 k行内容的小笔记本,从一本你也不知道有多少行的 C++ Primer 中进行摘抄,你应该怎么做才能让抄写的时候能让书中的每一行都等概率的出现在小笔记本中?

答:准备好一个公平的轮盘和一个巨大的摇奖机,

        轮盘上有k个数字,每个数字对应小笔记本的一行,抽中每个数字的概率相同

        摇奖机装置可以从放入其中的 i 个纸条中等概率的抽出一个纸条

开始遍历 C++ Primer 中的每一行,对于前k行,直接将他们的行号写到纸条上,放入摇奖机中

并且在一个record数组中记录下这些行号

在k行之后,同样将行号写到纸条上,然后把纸条放到摇奖机中开始摇奖,如果摇出来的纸条是轮盘上的某个数字num,那么将这个新放入的纸条上的行号替换调record中记录的这个数字,

直到把 C++ Primer 中的所有行都遍历完,就能达到效果,

用数学归纳法就可以证明所有行都可以等概率的出现在小笔记本中,而且这个概率是 k / n

其中n 是 C++ Primer 中的行数

假设读到 i - 1行,每一行能够出现在小笔记本上的概率是 k / (i - 1)

那么读到 i - 1 行时,第一行能够进入小笔记本的概率是

k / (i - 1) * (1 - (k / i) * (1 / k)) = k / i

图片来自B站UP主五点七边的视频【经典算法题】蓄水池抽样算法_哔哩哔哩_bilibili

382的代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
ListNode* _head;
public:
    Solution(ListNode* head) {
        _head = head;
    }
    
    int getRandom() {
        int val = _head->val;
        ListNode* nextnode = _head->next;
        int count = 2;
        while(nextnode){
            int x = rand() % count;
            if(x == 0){
                val = nextnode->val;
            }
            count++;
            nextnode = nextnode->next;
        }
        return val;
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* obj = new Solution(head);
 * int param_1 = obj->getRandom();
 */

http://www.kler.cn/a/467611.html

相关文章:

  • 基于Centos 7系统的安全加固方案
  • 利用webworker解决性能瓶颈案例
  • LookingGlass使用
  • 开源存储详解-分布式存储与ceph
  • Scala 访问修饰符
  • 软件需求规格是什么
  • LightGBM算法详解与PyTorch实现
  • vite-plugin-imagemin安装问题
  • 第五届电网系统与绿色能源国际学术会议(PGSGE 2025)
  • python学opencv|读取图像(二十五)使用cv2.putText()绘制文字进阶-垂直镜像文字
  • Kbuild学习知识点
  • Framebuffer 驱动
  • 网络安全学习路线
  • Springboot 升级带来的Swagger异常
  • PINN方程残差以及损失函数的理解
  • 探索电商新维度:利用JAVA爬虫获取1688店铺商品接口
  • MySQL 日志简介
  • 信息收集在网络安全中的重要性在网络安全领域,渗透测试
  • HTTP协议-报文结构
  • Java 内存溢出(OOM)问题的排查与解决
  • 《攀爬者》
  • 探讨面向未来的框架新技术:逻辑驱动和自适应框架的突破
  • k8s集群,CRI-Docker部署条件及方法
  • Spring Cloud微服务多模块架构:父子工程搭建实践
  • 提示词教程:零样本提示
  • ArkTs-@Builder引用传递问题