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

0382. 链表随机节点

文章目录

      • 题目链接
      • 题目描述
      • 解题思路
      • 参考代码
      • 参考代码(水塘抽样:O(1) 空间)
      • 复杂度分析

题目链接

https://leetcode.cn/problems/linked-list-random-node/

题目描述

给定一个单链表,实现一个类以等概率返回链表中的一个节点值。

解题思路

  • 你当前实现:预先遍历链表把所有值存入数组,getRandom 时用等概率随机索引返回。
    • 优点:实现简单,查询 O(1)。
    • 缺点:额外空间 O(n);当链表极大时不友好。
  • 进阶(水塘抽样 Reservoir Sampling):
    • 仅一次遍历,不使用额外数组即可等概率返回任一节点。
    • 思路:遍历到第 i 个节点时,以 1/i 的概率选择它替代当前答案。

参考代码

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {private final List<Integer> list = new ArrayList<>();private final Random rand = new Random();public Solution(ListNode head) {while (head != null) {list.add(head.val);head = head.next;}}public int getRandom() {int idx = rand.nextInt(list.size()); // 均匀分布 [0, size)return list.get(idx);}
}

参考代码(水塘抽样:O(1) 空间)

class Solution {private final ListNode head;private final Random rand = new Random();public Solution(ListNode head) {this.head = head;}public int getRandom() {int ans = -1;int i = 0;for (ListNode cur = head; cur != null; cur = cur.next) {i++;// 以 1/i 的概率选择当前节点if (rand.nextInt(i) == 0) {ans = cur.val;}}return ans;}
}

复杂度分析

  • 数组法:时间复杂度 O(n) 预处理 + O(1) 查询;空间复杂度 O(n)。
  • 水塘抽样:每次查询 O(n) 遍历;空间复杂度 O(1)。
http://www.dtcms.com/a/536362.html

相关文章:

  • Vue3 路由完全指南:从基础配置到权限控制
  • 宁波seo推广咨询长沙 建站优化
  • 邯郸做网站熊掌号什么自己做网站
  • Spring Boot3零基础教程,监听 Kafka 消息,笔记78
  • 【Swift】LeetCode 41. 缺失的第一个正数
  • cuda编程笔记(34)-- 内存访问控制与缓存提示
  • webserver类续
  • 条款22:使用Pimpl惯用法时,将特种成员函数的定义放到实现文件中
  • 基于python大数据的省级城市政企客户业务分析系统
  • 合肥微网站制作初中做语文综合题的网站
  • dedecms做论坛网站广州网页设计师学校
  • Blender + MCP 全流程详细图文教程
  • 自定义classload实现热加载案例
  • 上海网站建设seo站霸网络网站建设推销拜访客户怎么开头
  • Spring Bean的生命周期 第二次思考
  • HttpServletResponse下载文件
  • vue3的路由详解
  • Spring Boot 生产就绪特性浅析(一)
  • 如何做彩票网站信息手机上打开html的软件
  • 【图像处理基石】图像对比度增强入门:从概念到实战(Python+OpenCV)
  • 网站建设公司六安全国连锁装修公司加盟
  • 直播互动小程序端Web运营端接入指南
  • Java—抽象类
  • 坛墨网站建设wordpress 邀请
  • idc网站模版百度提交
  • 树莓派3B+降低功耗及恢复脚本
  • 开源项目解读4-高性能并发缓存库Ristretto
  • 《微信小程序》第五章:登录-API封装
  • MYSQL数据库入门操作
  • 青岛建设集团网站101工业设计有限公司