Java实现 LeetCode 528 按权重随机选择(TreeMap)

蔚落 2023-07-18 04:48 102阅读 0赞

528. 按权重随机选择

给定一个正整数数组 w ,其中 w[i] 代表位置 i 的权重,请写一个函数 pickIndex ,它可以随机地获取位置 i,选取位置 i 的概率与 w[i] 成正比。

说明:

1 <= w.length <= 10000
1 <= w[i] <= 10^5
pickIndex 将被调用不超过 10000 次
示例1:

输入:
[“Solution”,“pickIndex”]
[[[1]],[]]
输出: [null,0]
示例2:

输入:
[“Solution”,“pickIndex”,“pickIndex”,“pickIndex”,“pickIndex”,“pickIndex”]
[[[1,3]],[],[],[],[],[]]
输出: [null,0,1,1,1,0]
输入语法说明:

输入是两个列表:调用成员函数名和调用的参数。Solution 的构造函数有一个参数,即数组 w。pickIndex 没有参数。输入参数是一个列表,即使参数为空,也会输入一个 [] 空列表。

PS:
偷个懒

  1. class Solution {
  2. int sum=0;
  3. private TreeMap<int[], Integer> range = new TreeMap<>(new Comparator<int[]>() {
  4. @Override
  5. public int compare(int[] o1, int[] o2) {
  6. // 区间内
  7. if (o1[0] >= o2[0] && o1[1] < o2[1]) {
  8. return 0;
  9. // 小于,左区间
  10. } else if (o1[1] <= o2[0]) {
  11. return -1;
  12. // 大于
  13. } else {
  14. return 1;
  15. }
  16. }
  17. });
  18. public Solution(int[] w) {
  19. int start;
  20. for(int i=0;i<w.length;i++) {
  21. start = sum;
  22. sum += w[i];
  23. range.put(new int[]{ start, sum}, i);
  24. }
  25. }
  26. public int pickIndex() {
  27. int index = (int)(Math.random() * sum);
  28. if (range.get(new int[]{ index, index}) == null) {
  29. return 0;
  30. }else{
  31. return range.get(new int[]{ index, index});
  32. }
  33. }
  34. }
  35. /** * Your Solution object will be instantiated and called as such: * Solution obj = new Solution(w); * int param_1 = obj.pickIndex(); */

发表评论

表情:
评论列表 (有 0 条评论,102人围观)

还没有评论,来说两句吧...

相关阅读

    相关 528. 随机选择

    给定一个正整数数组 w ,其中 w\[i\] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 i 的概率与 w

    相关 值的随机选择算法

    一个新的功能上线都会走灰度的过程,万一新功能有问题,则会导致线上的大量的报错,甚至不可用的严重情况。比如我们现在本来接入了2个短信渠道去发送短信,现在接入好了第三个渠道,如果我