Leetcode 528. 按权重随机选择(中等) 前缀和数组+二分查找左侧边界
labuladong讲解
528. 按权重随机选择(中等)
题目:
思路:
对于[1,7],我们可以将其膨胀为长度为[1,7]的线段,而后产生[1,7]的int随机数x,当x落在1时返回0,当x落在2-7时返回1.实现等概率。
扩展的线段,可以用前缀和数组表示。
查找与x最接近的左侧数值时可以使用二分查找左侧边界实现。
返回时注意left-1,因为presum的id右移了一位
class Solution { public: Solution(vector<int>& w) { int n=w.size(); // 构建前缀和数组,偏移一位留给 preSum[0] presum.resize(n+1); for(int i=1;i<=n;++i){ // preSum[i] = sum(w[0..i-1]) presum[i]=presum[i-1]+w[i-1]; } } int pickIndex() { // 在闭区间 [1, preSum[n - 1]] 中随机选择一个数字 int index=rand()%presum.back()+1; // 获取 target 在前缀和数组 preSum 中的索引 // 搜索左侧边界的二分搜索 int left=1,right=presum.size()-1; while(left<=right){ int mid=left+(right-left)/2; if(presum[mid]<index){ left=mid+1; } else if(presum[mid]>index){ right=mid-1; } else{ right=mid-1; } } // preSum 的索引偏移了一位,还原为权重数组 w 的索引 return left-1; } // 前缀和数组 vector<int> presum; };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2018-02-28 虚拷贝