【LeetCode】382. 链表随机节点

news2024/11/28 22:46:13

382. 链表随机节点(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法一

思路

  • 定义两个链表,一个origin,用于每次调用 getRandom() 时进行初始化,一个 l 用于每次调用 getRandom() 时进行遍历,找到随机选定的元素。
  • 首先在 Solution() 的时候,使用 head 对于两个链表初始化,并对链表进行一次遍历,得到链表的长度;
  • 随机元素的选取:定义下标 pos,其范围在 [0, len-1] 之间。

注意

  • 在遍历链表得到随机元素的时候,条件需要严格限制,特别是链表一定得是非空
  • 其实这道题不够严谨,按照方法二的分析,如果题目加上“只允许遍历一次”的条件,那么我这个方法就不通过了,我进行了两次遍历,所以还是要学习蓄水池抽样算法

代码

/**
 * 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 {
public:
    ListNode* l;
    ListNode* origin;
    int len=0;
    Solution(ListNode* head) {
        // 初始化
        l = origin = head;
        while(l != nullptr){
            len ++;
            l = l->next;
        }
    }
    
    int getRandom() {
        int pos = rand() % len;
        // 复原链表     
        l = origin;
        while(pos-- && l != nullptr && l->next != nullptr){
           l = l->next;
        }
        return l->val;
    }
};

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

方法二: 蓄水池抽样算法

蓄水池抽样算法介绍

当内存无法加载全部数据时,如何从包含未知大小的数据流随机选取k个数据,并且要保证每个数据被抽取到的概率相等

该方法适用于只允许一次遍历链表的情况!

这道题的 k=1,也就是我们每次只能选取 1 个数据。假设数据流含有 N 个数,我们知道如果要保证所有的数被抽到的概率相等,那么每个数抽到的概率应该为 1/N 。

那如何保证呢?

  • 从前往后处理每个样本,每个样本成为答案的概率为 1/i​,其中 i 为样本编号(编号从 1 开始),最终可以确保每个样本成为答案的概率均为 1/n(其中 n 为样本总数)。
  • 容易证明该做法的正确性,详见参考资料2 。

思路

  • 在每一次 getRandom 时,从前往后处理每个节点,同时记录当前节点的编号,当处理到节点 k(k 从 1 开始) 时,在 [0,k) 范围内进行随机,若随机到结果为 0(发生概率为 1/k),则将节点 k 的值存入答案,最后一次覆盖答案的节点即为本次抽样结果

代码

/**
 * 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 {
public:
    Solution(ListNode* head) {
        // head只存放地址
        this->head = head;
    }
    
    /** Returns a random node's value. */
    int getRandom() {
        ListNode* phead = this->head;
        int val = phead->val;
        int count = 1;
        while (phead){
        	// 如果 rand() % count++ == 0
        	// 说明此时的概率为 1/count(k)
        	// 那么就对这个值进行替换
            if (rand() % count++ == 0)
                val = phead->val;
            phead = phead->next;
        }
        return val;
    }
    ListNode* head;
};

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

参考资料

  1. 蓄水池抽样算法

  2. 【宫水三叶】蓄水池抽样运用题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/550594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot原理——起步依赖与自动装配

文章目录 SpringBoot原理一、起步依赖二、自动配置2.1 概述2.2 工具类准备工作2.2.2 HeaderConfig2.2.3 HeaderGenerator2.2.4 HeaderParser2.2.5 MyImportSelector2.2.6 TokenParser2.2.7 pom.xml文件 2.3 自动配置原理2.3.1 引入工具类2.3.2 案例 : 访问第三方Bea…

GPT专业应用:撰写工作简报

●图片由Lexica 生成,输入:Workers working overtime 工作简报,作为一种了解情况、沟通信息的有效手段,能使上级机关和领导及时了解、掌握所属部门的政治学习、军事训练、行政管理等方面的最新情况;同时,能…

BERT输入以及权重矩阵形状解析

以下用形状来描述矩阵。对于向量,为了方便理解,也写成了类似(1,64)这种形状的表示形式,这个你理解为64维的向量即可。下面讲的矩阵相乘都是默认的叉乘。 词嵌入矩阵形状:以BERT_BASE为例,我们知道其有12层Encoder&…

记录--Vue中如何导出excel表格

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一、导出静态数据 1、安装 vue-json-excel npm i vue-json-excel注意,此插件对node有版本要求,安装失败检查一下报错是否由于node版本造成! 2、引入并注册组件(以全…

【CSS语法应用在Qt中的QSS和文本】第一天

CSS语法应用在Qt中的QSS和文本 【1】CSS语法【1】QSS使用以上CSS语法【1.1】QTextBrowser设置样式表【1.2】QTextBrowser使用CSS语法设置文本样式 【1】CSS语法 💛💛💛💛💛💛💛💛&am…

Redis的五大类型

一、String数据类型 概述:String是redis最基本的类型,最大能存储512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等 1. SET/GET/APPEND/STRLEN: append命令:append key valu…

【mysql】explain执行计划之id列

目录 一、说明二、示例2.1 id相同,执行顺序从上到下2.2 id不相同,id值越大越先执行2.3 既有id相同也有id不同的情况,先执行序号大的,再同级从上往下执行2.4 id列显示为null的最后执行。表示结果集,不需要使用它来进行查…

记录一次windows mysql5.7安装失败的过程

首先下载mysql安装包 windows版本 https://dev.mysql.com/downloads/installer/ 接着 在执行安装mysql msi安装包最后一步的时候,显示 Failed to start service MySQL57. 只有在任务处于完成状态(RanToCompletion、Fau 这时候 检查要么windows下面mysql的卸载残留没…

AUTOSAR-文档命名说明

文章目录 AUTOSAR_TR_PredefinedNamesAutosar验收测试基本说明 AUTOSAR_TR_PredefinedNames AUTOSAR_TR_PredefinedNames(Predefined Names in AUTOSAR).pdf对基础软件标准规范文档的分类信息做出了介绍,其中常用的文档包括EXP、PRS、RS、SR…

【C++】类和对象(中)---取地址及const取地址操作符重载、const成员函数的使用

个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C之路】💌 本专栏旨在记录C的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长&…

缓存穿透的解决办法有哪些?

一、概述 缓存穿透是指查询一个不存在的数据,由于缓存和数据库都没有命中,导致每次请求都需要从数据库中读取数据,增加了数据库的负担。解决缓存穿透的方法有以下几种: 布隆过滤器(Bloom Filter):使用位数组来表示一个集合&#…

iptables防火墙概念

iptables防火墙 一、iptables概述1.netfilter 与 iptables 的关系1)netfilter2)iptables 2.四表五链1)四表2)五链3)表的匹配优先级4)规则链之间的匹配顺序5)规则链内的匹配顺序 二、iptables防火…

国外大神用 ChatGPT 成功打造一个「虚拟空间传送」系统!

公众号关注 “GitHubDaily” 设为 “星标”,每天带你逛 GitHub! 相信大家小时候躺在床上,都曾设想过这么一个场景: 当你闭上眼睛时,感觉身心十分安宁,物理世界慢慢淡出,身体也随着变得飘逸&…

【mysql】explain执行计划之select_type列

目录 一、说明二、示例2.1 simple:简单表,不使用union或者子查询2.2 primary:主查询,外层的查询2.3 subquery:select、where之后包含了子查询,在select语句中出现的子查询语句,结果不依赖于外部…

5.21下周黄金走势分析及开盘独家交易策略

近期有哪些消息面影响黄金走势?下周黄金多空该如何研判? ​黄金消息面解析:周五(5月19日)美市尾盘,现货黄金收报1977.54美元/盎司,大幅上升19.99美元或1.02%,日内最高触及1984.22美元/盎司,最低…

【LeetCode: 10. 正则表达式匹配 | 暴力递归=>记忆化搜索=>动态规划 】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【工程化】记录在react工程中eslint、prettier等formatter以及git提交等规范的知识点

文章目录 前言创建eslint安装prettier安装.eslintrc.js完善独立的vscode设置到这一步要重启vscodehuskycommit-lint一切准备就绪,开干! 前言 由于使用ACR的方式创建react工程时,并不会像vue一样有每一步的安装提示,需要我们在创建…

用爬虫分析沪深300指数超长走势

我们知道,一个股市里面有非常多的股票,我们如何能够量化整个股市整体的行情呢,答案是通过一些综合性的指数。本文所选用的沪深300就是这类指数中的一个。我们先来看一下百度百科对于沪深300的解释。 由于股票价格起伏无常, 投资者…

跟姥爷深度学习6 卷积网络的数学计算

一、前言 前面简单用TensorFlow的全连接网络做了气温预测然后深入了解了一下全连接网络的数学计算,接着用CNN(卷积)网络做了手写数字识别,本篇就接着这个节奏来看卷积网络的数学计算。 二、卷积网络回顾 前面我们使用卷积网络时…

setContentHuggingPriority和setContentCompressionResistancePriority的使用

需求&#xff1a; 两个label并排显示&#xff0c;文字内容由服务器返回&#xff0c;label宽度以文字内容自适应&#xff0c;label之间间距大于等于10. 需要考虑以下情况&#xff1a; 当两个label的宽度和 < 屏幕宽度时&#xff0c;各自设置约束&#xff0c;无需处理&#…