标签:映射 int 黑名单 bound 710 blacklist LeetCode 范围
710. 黑名单中的随机数
1.题目
题目链接:
710. 黑名单中的随机数
2.题解
该题目的解题方法比较巧妙,值得学习。中心思想是将该范围分成两个小范围 [0,n-m) 和 [ n-m, n-1 ] ,将 [0,n-m) 范围内的黑名单数与 [ n-m, n-1 ] 范围内的非黑名单数映射,在范围 [0,n-m) 内取随机数,当随机数是黑名单数时,可以从哈希表中获取到其所映射的非黑名单数再返回。
其映射情况大致有以下三种:
情况一:n=7,黑名单blacklist为[0,1,2],其映射情况如下所示:
情况二:n=7,黑名单blacklist为[4,5,6],其映射情况如下所示:
情况三:n=7,黑名单blacklist为[1,5,6],其映射情况如下所示:
3.代码
1 class Solution { 2 3 Map<Integer,Integer> map; 4 Random random; 5 int bound; 6 7 public Solution(int n, int[] blacklist) { 8 map = new HashMap<>(); 9 random = new Random(); 10 int m = blacklist.length; 11 bound = n - m; 12 Set<Integer> black = new HashSet<>(); 13 // 找到在范围[bound,n-1]之间的黑名单数字 14 for(int b: blacklist){ 15 if(b>=bound){ 16 black.add(b); 17 } 18 } 19 20 int w = bound; 21 // 将在[0,bound)范围内的黑名单数,指向一个在[bound,n-1]范围内的非黑名单数 22 // 由于[bound,n-1]范围内的数正好是黑名单的个数,所以在给范围内的非黑名单数必然被不在该范围内的黑名单数所映射 23 for(int b: blacklist){ 24 if(b < bound){ 25 while(black.contains(w)){ 26 w++; 27 } 28 map.put(b,w); 29 w++; 30 } 31 } 32 } 33 34 public int pick() { 35 int x = random.nextInt(bound); 36 return map.getOrDefault(x,x); 37 } 38 }
标签:映射,int,黑名单,bound,710,blacklist,LeetCode,范围 来源: https://www.cnblogs.com/yqsumAll/p/16413044.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。