1. 题目

https://leetcode-cn.com/problems/random-pick-index/
给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。
注意:
数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。
示例:

  1. int[] nums = new int[] {1,2,3,3,3};
  2. Solution solution = new Solution(nums);
  3. // pick(3) 应该返回索引 2,3 或者 4。每个索引的返回概率应该相等。
  4. solution.pick(3);
  5. // pick(1) 应该返回 0。因为只有nums[0]等于1。
  6. solution.pick(1);

2. 题解

2022-04-25 AC, 定长的就比较简单, 直接map, 如果实际中是流的数据方式更推荐”蓄水池抽样”解法

  1. <?php
  2. /**
  3. * Created by PhpStorm
  4. * User: jtahstu
  5. * Time: 2022/4/25 10:05
  6. * Des: 398. 随机数索引
  7. * https://leetcode-cn.com/problems/random-pick-index/
  8. * 给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。
  9. * 注意:数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。
  10. */
  11. class Solution
  12. {
  13. private $list;
  14. /**
  15. * @param Integer[] $nums
  16. */
  17. function __construct($nums)
  18. {
  19. foreach ($nums as $k => $num) {
  20. $this->list[$num][] = $k;
  21. }
  22. }
  23. /**
  24. * @param Integer $target
  25. * @return Integer
  26. */
  27. function pick($target)
  28. {
  29. $indexs = $this->list[$target];
  30. return $indexs[rand(0, count($indexs) - 1)];
  31. }
  32. }
  33. /**
  34. * Your Solution object will be instantiated and called as such:
  35. * $obj = Solution($nums);
  36. * $ret_1 = $obj->pick($target);
  37. */
  38. $solution = new Solution([1, 2, 3, 3, 3]);
  39. var_dump($solution->pick(3));
  40. var_dump($solution->pick(1));
  41. /**
  42. * 执行用时:116 ms, 在所有 PHP 提交中击败了100.00%的用户
  43. * 内存消耗:39.1 MB, 在所有 PHP 提交中击败了50.00%的用户
  44. * 通过测试用例:14 / 14
  45. */
  1. 咱这属于哈希表预处理(定长数据流)
    2. 另一个解法是蓄水池抽样(不定长数据流)
    关于该解法为啥选取的概率相同, 可谷歌证明方式 ```java class Solution { Random random = new Random(); int[] nums; public Solution(int[] _nums) {
     nums = _nums;
    
    } public int pick(int target) {
     int n = nums.length, ans = 0;
     for (int i = 0, cnt = 0; i < n; i++) {
         if (nums[i] == target) {
             cnt++;
             if (random.nextInt(cnt) == 0) ans = i;
         }
     }
     return ans;
    
    }

```