跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

LeetCode 398. Random Pick Index 解题思路与 Python 实现

综述由AI生成针对 LeetCode 398 随机抽取索引问题,分析了两种主要解法。哈希表预存储方案适合高频查询,空间换时间;列表推导式动态筛选方案节省初始化空间,适合低频查询。重点指出仅返回首次出现位置的做法因缺乏随机性会导致错误。代码均基于 Python 实现,确保概率均匀分布。

t ag发布于 2021/1/14更新于 2026/6/519 浏览
LeetCode 398. Random Pick Index 解题思路与 Python 实现

问题背景

给定一个可能包含重复元素的整数数组,要求随机输出目标数字的索引。假设目标数字一定存在于数组中,且每个有效索引被选中的概率必须相等。

关键约束:

  • 数组规模可能非常大。
  • 使用过多额外空间的方案无法通过评测。
  • 必须保证随机性,不能总是返回同一个位置。

核心思路

这道题的核心在于如何在保证随机性的前提下平衡空间与时间复杂度。我们通常有两种主流策略:预处理构建索引映射,或者在查询时动态筛选。

方案一:哈希表预存储

如果查询操作非常频繁,而初始化只进行一次,那么预先将每个数字对应的所有索引存入字典是最高效的。这样 pick 操作的时间复杂度可以降到 O(1)。当然,这需要 O(N) 的额外空间来存储索引列表。

import random

class Solution:
    def __init__(self, nums):
        self.d = {}
        for i, v in enumerate(nums):
            if v in self.d:
                self.d[v].append(i)
            else:
                self.d[v] = [i]

    def pick(self, target):
        arr = self.d[target]
        return arr[random.randint(0, len(arr) - 1)]

这里利用 random.randint 从索引列表中均匀采样。实际运行时,这种方案的内存占用会随数据量线性增长,适合内存充足且查询密集的场景。

方案二:列表推导式动态筛选

如果内存受限,或者查询频率不高,我们可以选择在调用 pick 时遍历数组找出所有匹配项。虽然单次查询变慢为 O(N),但节省了初始化时的空间开销。

import random

class Solution:
    def __init__(self, nums):
        self.nums = nums

    def ():
        idxs = [i  i, num  (.nums)  num == target]
         random.choice(idxs)
pick
self, target
for
in
enumerate
self
if
return

这种方式代码更简洁,利用了 Python 的列表推导式。性能测试显示,在特定数据分布下,它的运行效率往往优于第一种方案,因为避免了维护庞大的字典结构。

常见误区

有些初学者会尝试直接返回第一次出现的位置,例如:

# 错误示范
for i, num in enumerate(self.nums):
    if num == target:
        return i

这种做法虽然能通过部分简单测试,但完全违背了题目要求的'随机性'。它总是返回同一个索引,导致概率分布不均,会被判定为 Wrong Answer。

总结

处理此类随机抽取问题时,务必确认概率分布是否均匀。根据实际场景的内存限制和查询频率,选择哈希表预存还是动态扫描,是解决 LeetCode 398 的关键。

目录

  1. 问题背景
  2. 核心思路
  3. 方案一:哈希表预存储
  4. 方案二:列表推导式动态筛选
  5. 常见误区
  6. 错误示范
  7. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 9 篇必读的大模型论文
  • 大模型入门指南:从基础原理到进阶应用详解
  • Java 集成 PaddlePaddle OCR:实现离线文字识别
  • 知识蒸馏算法原理与大模型压缩应用
  • PyCharm 断点调试 GLM-4.6V-Flash-WEB Python 脚本
  • 1Panel 部署 Open WebUI:ghcr.io 镜像加速与无缝切换方案
  • C++ 红黑树设计与实现详解
  • SpringCloud 微服务架构快速入门与实践
  • 深入解析 Java 线程池的开源扩展方案
  • Django Web 框架实战:从零构建产品管理系统
  • AI 大模型 RAG 技术详解:原理与实战应用
  • 飞算 JavaAI 插件实战:半小时完成考勤系统开发
  • 语义化 AI 驱动器:提示词工程的技术演进与未来应用
  • AI Agent 生产级框架实战:架构设计与核心实现
  • Linux 进程信号入门:从原理到实战
  • Windows 环境下 OpenClaw 本地部署与飞书接入实战
  • 注意力机制与 Transformer 模型实战
  • Lottie-Web 动画开发技术指南
  • 前端实时通信与 WebSocket 核心原理及实战
  • Wan2.2 视频生成风格单一?LoRA 微调实战提升多样性

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online