news 2026/11/6 8:50:11

DeepSeek LeetCode 528. 按权重随机选择 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 528. 按权重随机选择 Java实现

LeetCode 528. 按权重随机选择(Java)

思路:前缀和 + 二分查找

把权重数组 w 展开成"区间":

w = [1, 3, 2] 前缀和 = [1, 4, 6] 下标 0 占区间 [0, 1) —— 长度 1 下标 1 占区间 [1, 4) —— 长度 3 下标 2 占区间 [4, 6) —— 长度 2

随机生成 r ∈ [0, total),在前缀和数组中二分查找第一个 > r 的位置 idx,idx 就是答案。
因为每个下标对应的区间长度正好等于它的权重,所以命中概率 = 权重 / 总权重。


代码实现

classSolution{privatefinalint[]prefix;// 前缀和数组privatefinalinttotal;// 总权重privatefinalRandomrandom=newRandom();publicSolution(int[]w){intn=w.length;prefix=newint[n];intsum=0;for(inti=0;i<n;i++){sum+=w[i];prefix[i]=sum;}total=sum;}publicintpickIndex(){// 随机生成 [0, total) 之间的整数inttarget=random.nextInt(total);// 二分查找第一个 prefix[mid] > target 的下标intleft=0,right=prefix.length-1;while(left<right){intmid=left+(right-left)/2;if(prefix[mid]<=target){left=mid+1;}else{right=mid;}}returnleft;}}

示例验证

w = [1, 3, 2],prefix = [1, 4, 6],total = 6

随机 r 二分结果 idx 对应区间
0 0 [0, 1)
1 1 [1, 4)
2 1 [1, 4)
3 1 [1, 4)
4 2 [4, 6)
5 2 [4, 6)

命中概率:下标 0 → 1/6,下标 1 → 3/6,下标 2 → 2/6,正好等于权重比例。✅


复杂度

· 构造:O(n)
· pickIndex:O(log n)(二分查找)
· 空间:O(n)(前缀和数组)


易错点

  1. 区间是左闭右开:random.nextInt(total) 生成 [0, total),配合"第一个 > target"的二分,刚好不重不漏。
    若写成 [0, total] 或二分条件写成 >=,边界会出错(target = 0 时容易误判)。
  2. 二分边界模板:这里用的是"找第一个满足条件的位置"的经典写法,left < right + right = mid,最后返回 left。
  3. 溢出:题目约束下 total ≤ 10^9,int 足够;若权重更大需改用 long。
  4. Random 线程安全:java.util.Random 是线程安全的(内部用 CAS),但多线程高并发下可考虑 ThreadLocalRandom.current().nextInt(total) 提升性能:
inttarget=ThreadLocalRandom.current().nextInt(total);
  1. 不要每次 pickIndex 重新构建前缀和:前缀和只需构造一次,pickIndex 只做二分。

另一种写法:TreeMap

classSolution{privatefinalTreeMap<Integer,Integer>map=newTreeMap<>();privatefinalinttotal;privatefinalRandomrandom=newRandom();publicSolution(int[]w){intsum=0;for(inti=0;i<w.length;i++){sum+=w[i];map.put(sum,i);// 前缀和 -> 下标}total=sum;}publicintpickIndex(){inttarget=random.nextInt(total);// 返回 key > target 的最小条目returnmap.higherEntry(target).getValue();}}

TreeMap.higherEntry(target) 返回严格大于 target 的最小 key,正好对应二分结果。代码更简洁,但常数略大。


推荐

面试中写前缀和 + 二分最标准,能体现对边界和概率映射的理解。TreeMap 版本可作补充。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/6 8:49:47

Palantir 的“本体论”-中国式落地实践

摘要&#xff1a;本文从 Palantir 的“本体论”语义框架谈起&#xff0c;分享我们在工业现场落地的一套语义化系统&#xff1a;以数据底座接入 40 多种工业协议&#xff0c;用语义层把工厂抽象成 13 种节点类型并构建语义树&#xff0c;再由智能执行层内置 27 种工业分析算子并…

作者头像 李华
网站建设 2026/11/6 8:48:20

Agent 短期记忆与会话隔离:多轮任务如何不串线

目录 一、三个串线现场 &#xff08;一&#xff09;别人的答案出现在我的回答里 &#xff08;二&#xff09;同一个用户的两件事互相污染 &#xff08;三&#xff09;用户改口了&#xff0c;但旧口径还在起作用 &#xff08;四&#xff09;三个现场指向同一组缺失 二、三…

作者头像 李华
网站建设 2026/11/6 8:24:42

Windows域控设置IE主页 默认打开百度 【全域策略生效】

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/6 8:22:31

嵌入式LLM实战:从资源约束到硬件闭环的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/6 8:17:26

车联网数据处理系统架构与实现关键技术

1. 项目背景与核心价值车联网数据正在成为智慧交通领域的重要基础设施。每天产生的车辆轨迹、速度、位置等数据量级可达TB级别&#xff0c;如何高效采集、存储和分析这些数据是行业痛点。这个项目通过构建完整的车联网数据处理流水线&#xff0c;实现了从数据采集到可视化展示的…

作者头像 李华