LeetCode-382:Linked List Random Node (随机返回链表结点)

(NOI)打表骗分过样例,暴力枚举出奇迹1.8.22题解                                                                                                                                                            48818 B题解 #include <iostream> u... 阅读详情

题目:

Given a singly linked list, return a random node’s value from the linked list. Each node must have the same probability of being chosen.

Follow up:
What if the linked list is extremely large and its length is unknown to you? Could you solve this efficiently without using extra space?

例子:

Example:

// Init a singly linked list [1,2,3].
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
Solution solution = new Solution(head);

// getRandom() should return either 1, 2, or 3 randomly. Each element should have equal probability of returning.
solution.getRandom();

问题解析:

设计一个类,该类能够实现随机返回链表中的一个结点。如果链表的结点数量非常的多,或者其长度是未知的,或者结点是从一个流中出现的,则如何做到以同样的概率随机返回一个结点的值。

链接:

思路标签

蓄水池算法

解答:

  • 从题目可知,该问题是蓄水池算法的特例:只随机返回一个值;
  • 对于常规的随机算法,我们使用语言自带的随机函数即可实现;但是对于数量居多无法实现内存加载、值从流中输入长度未知的情况,我们无法做到先统计数量再使用随机函数实现,所以就会用到蓄水池算法。
  • 在序列流中取一个数,确保随机性:
    • 假设已经读取n个数,现在保留的数是 Ax A x ,取到 Ax A x 的概率为(1/n);
    • 对于第n+1个数 An+1 A n + 1 ,以1/(n+1)的概率取 An+1 A n + 1 ,否则仍然取 Ax A x 。依次类推,可以保证取到数据的随机性。
    • 数学归纳法证明如下:
      • 当n=1时,显然,取A1。取A1的概率为1/1。
      • 假设当n=k时,取到的数据 Ax A x 。取 Ax A x 的概率为1/k。
      • 当n=k+1时,以1/(k+1)的概率取 An+1 A n + 1 ,否则仍然取Ax。
      • (1)如果取 An+1 A n + 1 ,则概率为1/(k+1);
      • (2)如果仍然取 Ax A x ,则概率为(1/k)*(k/(k+1))=1/(k+1);(相当于在取 Ax A x 的基础上,不取 An+1 A n + 1 )
  • 所以,对于所有流入的数,均是以1/(n+1)的概率取到,都是等概率的。
  • 数据流取一个数的代码:
//在序列流中取一个数,保证均匀,即取出数据的概率为:1/(已读取数据个数)
void RandNum(){    
    int res=0;
    int num=0;
    num=1;
    cin>>res;

    int tmp;
    while(cin>>tmp){
        if(rand()%(num+1)+1>num)
            res=tmp;
        num++;
    }
    cout<<"res="<<res<<endl;
}
  • 在序列流中取k个数,确保随机性
    • 建立一个数组,将序列流里的前k个数,保存在数组中。(也就是所谓的”蓄水池”)
    • 对于第n个数 An A n ,以k/n的概率取 An A n 并以1/k的概率随机替换“蓄水池”中的某个元素;否则“蓄水池”数组不变。依次类推,可以保证取到数据的随机性。
    • 数学归纳法证明如下:
      • 当n=k时,显然“蓄水池”中任何一个数都满足,保留某个数的概率为k/k=1;
      • 假设当n=m(m>k)时,“蓄水池”中每个元素被采样的概率等于k/m;
      • 那么对于第m+1个元素,其被抽样的概率为k/(m+1);
      • 对于已经在蓄水池中的m个元素,每个元素被抽样的概率由两部分组成:
        • (1) 如果第m+1个元素未被采样,则此部分的概率为(k/m)∗(1−k/(m+1));
        • (2) 如果第m+1个元素被采样,但是在蓄水池中的元素未被第m+1个元素替换,则此部分概率为:(k/m) ∗ (k/(m+1)) ∗ (k−1/k)
      • 将上面的两部分相加,即得蓄水池算法池中已有元素被抽样的概率为:

km∙(1−km+1)+km∙km+1∙k−1k=km+1 k m ∙ ( 1 − k m + 1 ) + k m ∙ k m + 1 ∙ k − 1 k = k m + 1

  • 所以,对于流入的m+1个数,均是以k/(m+1)的概率取任意一个数,都是等概率的。
  • 随机选取k个数的代码:
//在序列流中取n个数,保证均匀,即取出数据的概率为:n/(已读取数据个数)
void RandKNum(int n){
    int *myarray=new int[n];
    for(int i=0;i<n;i++)
        cin>>myarray[i];

    int tmp=0;
    int num=n;
    while(cin>>tmp){
        if(rand()%(num+1)+1<n)    
            myarray[rand()%n]=tmp;
    }

    for(int i=0;i<n;i++)
        cout<<myarray[i]<<endl;
}
  • 本题未知长度链表List的解法:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    /** @param head The linked list's head.
        Note that the head is guaranteed to be not null, so it contains at least one node. */
    Solution(ListNode* head) head(head), listSize(0){
    }

    /** Returns a random node's value. */
    int getRandom() {
        int res = head->val;
        ListNode* pNode = head->next;
        int i = 2;
        while(pNode != nullptr){
            int j = rand()%i;
            if(j == 0)
                res = pNode->val;

            pNode = pNode->next;
            i++;
        }
        return res;
    }

private:
    ListNode* head;
    int listSize;
    int random(int x){
        return rand()%x;
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(head);
 * int param_1 = obj.getRandom();
 */
Cadence仿真实战:从零构建高精度带隙基准电压源 本文是一份详细的Cadence仿真实战指南,指导读者从零开始构建高精度带隙基准电压源。文章首先解释了带隙基准电压源稳定输出电压的原理,然后逐步演示了在Cadence Virtuoso环境中如何搭建测试电路、测量关键温度系数、计算并搭建核心电路,并通过参数扫描和迭代调优来驯服温度漂移,最终实现低漂移的基准电压输出。 阅读详情

相关推荐

记一次wireshark抓取QQ好友IP和火绒抓取微信IP

事情是这样的,,上个周,手机离奇的被盗,但没有关机,为了找回手机,粗学了一手QQ抓ip的手段。 这里我就直接做个演示,解析关键的点。 三种思路i. wireshark 抓取手机在线IPii 火绒抓取 微信在线接听IPiii 火绒抓取 微信在线不接听IP i. wireshark 抓取手机在线IP wireshark抓好友QQ的ip要求和对方打语音的时候要手机在线。 这里说一下,打语音和视频是直接能和对方建立连接,如果发文件,是直接发给腾讯的,抓不到包。 1.打开wireshark,通过电脑Tim给对方打语音

qq_29437513的博客 1万+

关于LinkedList和LinkedListNode

1.概念:  List是数组链表 LinkedList是指针链表、双向链表 选择List还是LinkedList要看你的使用特点. 数组链表访问快,复杂度O(1),但是添加删除复杂度O(n) 指针链表访问复杂度是O(n),但是添加删除很快O(1) 2.含义 LinkedList集合类没有非泛型类的版本,它是一个双向链表,它的元素指向元素的前一个与后一个元素 链表的优点是:如果要

雍王爷的博客 1万+

C#通过Aforge调用电脑摄像头(附代码)

C#标准库本身不带有能调用电脑摄像头的库,如果利用windows自身的API来实现的话,着实有些麻烦。Aforge这个第三方库能很好的实现调用、处理的功能。 PS:文末给大家分享了完整的项目源码,各位最好先下载下来,对照着来看 1、先看一下效果 2、Aforge介绍 AForge.NET是一个专门为开发者和研究者基于C#框架设计的,这个框架提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域。 3、我使用的开发环境 操作系统

weixin_44996090的博客 1万+

LinkedList底层原理

从插入,删除,查找分析源码,结合源码分析LinkedList特点。

m0_61160520的博客 1484

C++常见面试题总结

C++常见面试题总结

xu_fu_yong的专栏 8万+

【模型构建器教程】教你在ArcGIS中如何按照字段值批量导出shp文件

【模型构建器教程】教你在ArcGIS中如何按照字段值批量导出shp文件

weixin_45469245的博客 6454

RandomListNode 复杂链表类型结构

package java2019; public class RandomListNode { int val; RandomListNode next; RandomListNode random; public RandomListNode(int val){ this.val=val; } }

qq_43718903的博客 896

基于PTB-XL数据集的深度学习心电信号分类

心电信号的分析与处理是心血管疾病诊断的重要手段。该领域的主要工作领域是分类,它越来越多地得到基于机器学习的算法的支持。在这项工作中,开发了一个深度神经网络来自动分类初级心电信号。这项研究是在PTB-XL数据库中包含的数据上进行的。提出了三种神经网络架构:第一种基于卷积网络,第二种基于SincNet,第三种基于卷积网络,

weixin_55121617的博客 7007

【LeetCode】382. 链表随机节点

day166 蓄水池抽样算法

weixin_43894455的博客 717

Unity Android平台下插件/SDK开发通用流程

本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与插件的开发。

ZhangDi2017的博客 1万+

收放卷伺服控制系统详细算法介绍(电子齿轮+张力PID卷绕轴控制功能块)

收放卷控制系统涉及的内容非常多,这里我们介绍全伺服系统利用电子齿轮指令实现主从轴的比例随动速度控制,收放卷控制算法介绍常用链接如下1、收放卷+排线控制收放卷+排线控制系统框图-优快云博客文章浏览阅读24次。1、收放卷前馈量计算FC收放卷前馈量计算FC(CODESYS ST源代码)-优快云博客文章浏览阅读16次。1、收放卷前馈量计算FC(博途PLC):收放卷前馈量计算FC(梯形图+SCL代码)-优快云博客文章浏览阅读534次。2、收放卷前馈量计算FC。

RXXW_Dor的博客 3122

leetcode:382. 链表随机节点

题目来源 382. 链表随机节点 题目描述 题目解析 链表转数组 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

OceanStar的博客 408

一文读懂「Chain of Thought,CoT」思维链

Chain-of-Thought(CoT)是一种改进的Prompt技术,目的在于提升大模型LLMs在复杂推理任务上的表现,对于复杂问题尤其是复杂的数学题大模型很难直接给出正确答案。如算术推理(arithmetic reasoning)、常识推理(commonsense reasoning)、符号推理(symbolic reasoning)。COT通过要求模型在输出最终答案之前,显式输出中间逐步的推理步骤这一方法来增强大模型的算数、常识和推理能力。简单,但有效。2022 年,在 Google 发布的论文。

女王の专属领地 4万+

LeetCode 382. Linked List Random Node 题解

本题是蓄水池抽样算法的经典应用。蓄水池抽样:以 1/i 的概率选择第 i 个元素数学证明:每个元素最终被选中的概率都是 1/n时间-空间权衡:可以预先存储所有值来优化查询通过本题可以深入理解蓄水池抽样算法在大数据流处理中的应用。

cannonjinx的博客 4306

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LeetCode //C - 382. Linked List Random Node

【代码】LeetCode //C - 382. Linked List Random Node。

Made in Code 1177

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Leetcode 382. Linked List Random Node(python+cpp)

Leetcode 382. Linked List Random Node题目解法1:解法2:水库取样 题目 解法1: 第一种方法就是最容易想到的,求出链表的长度,然后从这个长度区间里去一个随机位置返回 python的代码如下: class Solution: def __init__(self, head: ListNode): """ @param head The linked list's head. Note that the head i

qq_37821701的博客 368

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LeetCode 382. Linked List Random Node 题解(C++)

Given a singly linked list, return a random node's value from the linked list. Each node must have the same probability of being chosen.

prayyojay的博客 517

LeetCode——382Linked List Random Node

Given a singly linked list, return a random node's value from the linked list. Each node must have thesame probabilityof being chosen. Follow up: What if the linked list is extremely large and its ...

学习记录本 2728

leetcode 382. Linked List Random Node | 382. 链表随机节点(Java)

题目 https://leetcode.com/problems/linked-list-random-node/ 题解 先存起来,再随机返回即可。不知道在考察什么? /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val;

寒泉 4万+

[leetcode] 382. Linked List Random Node 解题报告

题目链接: https://leetcode.com/problems/linked-list-random-node/ Given a singly linked list, return a random node's value from the linked list. Each node must have the same probability of being chose

小榕流光的专栏 4889

[leetcode] 382. Linked List Random Node

Given a singly linked list, return a random node's value from the linked list. Each node must have the same probability of being chosen. Follow up: What if the linked list is extremely large and i

TstsUgeg的博客 1307

leetcode学习笔记382 Linked List Random Node

leetcode学习笔记382问题思考方法1方法2 问题 Linked List Random Node Given a singly linked list, return a random node’s value from the linked list. Each node must have the same probability of being chosen. Follow up: What if the linked list is extremely large and its leng

kuma的博客 241

LeetCode-382. Linked List Random Node [C++][Java]

Given a singly linked list, return a random node's value from the linked list. Each node must have thesame probabilityof being chosen.

贫道绝缘子的博客 207

【Leetcode】Linked List Random Node

题目链接:https://leetcode.com/problems/linked-list-random-node/ 题目: Given a singly linked list, return a random node's value from the linked list. Each node must have the same probability of being c

业精于勤,荒于嬉 2417

【leetcode】382. Linked List Random Node

一、题目描述 Given a singly linked list, return a random node's value from the linked list. Each node must have the same probability of being chosen. Follow up: What if the linked list is extremely

小拳头的博客 338

leetcode382 Linked List Random Node java

DescriptionGiven a singly linked list, return a random node’s value from the linked list. Each node must have the same probability of being chosen.Follow up: What if the linked list is extremely large

店小不二的博客 514
上一篇: LeetCode-146:LRU Cache (最近使用缓存)
下一篇: LeetCode-347:Top K Frequent Elements (前K个频率最高的元素)
大树先生的博客
博客等级 码龄9年 2692粉丝 200原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值