美文网首页
398. Random Pick Index

398. Random Pick Index

作者: Jeanz | 来源:发表于2018-02-20 12:18 被阅读0次

    Given an array of integers with possible duplicates, randomly output the index of a given target number. You can assume that the given target number must exist in the array.

    Note:
    The array size can be very large. Solution that uses too much extra space will not pass the judge.

    Example:

    int[] nums = new int[] {1,2,3,3,3};
    Solution solution = new Solution(nums);
    
    // pick(3) should return either index 2, 3, or 4 randomly. Each index should have equal probability of returning.
    solution.pick(3);
    
    // pick(1) should return 0. Since in the array only nums[0] is equal to 1.
    solution.pick(1);
    

    解法:Reservoir Sampling

    public class ReservoirSamplingTest {
    
        private int[] pool; // 所有数据
        private final int N = 100000; // 数据规模
        private Random random = new Random();
    
        @Before
        public void setUp() throws Exception {
            // 初始化
            pool = new int[N];
            for (int i = 0; i < N; i++) {
                pool[i] = i;
            }
        }
    
        private int[] sampling(int K) {
            int[] result = new int[K];
            for (int i = 0; i < K; i++) { // 前 K 个元素直接放入数组中
                result[i] = pool[i];
            }
    
            for (int i = K; i < N; i++) { // K + 1 个元素开始进行概率采样
                int r = random.nextInt(i + 1);
                if (r < K) {
                    result[r] = pool[i];
                }
            }
    
            return result;
        }
    
        @Test
        public void test() throws Exception {
            for (int i : sampling(100)) {
                System.out.println(i);
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:398. Random Pick Index

          本文链接:https://www.haomeiwen.com/subject/jtqgtftx.html