All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0301_0400.s0398_random_pick_index.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0301_0400.s0398_random_pick_index;

// #Medium #Hash_Table #Math #Randomized #Reservoir_Sampling
// #2022_07_15_Time_102_ms_(83.94%)_Space_81.3_MB_(76.10%)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * 398 - Random Pick Index\.
 *
 * Medium
 *
 * Given an integer array `nums` 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.
 *
 * Implement the `Solution` class:
 *
 * *   `Solution(int[] nums)` Initializes the object with the array `nums`.
 * *   `int pick(int target)` Picks a random index `i` from `nums` where `nums[i] == target`. If there are multiple valid i's, then each index should have an equal probability of returning.
 *
 * **Example 1:**
 *
 * **Input** 
 *
 *     ["Solution", "pick", "pick", "pick"] 
 *     [[[1, 2, 3, 3, 3]], [3], [1], [3]]
 *
 * **Output:** [null, 4, 0, 2]
 *
 * **Explanation:** 
 *
 *     Solution solution = new Solution([1, 2, 3, 3, 3]); 
 *     solution.pick(3); // It should return either index 2, 3, or 4 randomly. Each index should have equal probability of returning. 
 *     solution.pick(1); // It should return 0. Since in the array only nums[0] is equal to 1. 
 *     solution.pick(3); // It should return either index 2, 3, or 4 randomly. Each index should have equal probability of returning.
 *
 * **Constraints:**
 *
 * *   1 <= nums.length <= 2 * 104
 * *   -231 <= nums[i] <= 231 - 1
 * *   `target` is an integer from `nums`.
 * *   At most 104 calls will be made to `pick`.
**/
@SuppressWarnings("java:S2245")
public class Solution {
    // O(n) time | O(n) space
    private Map> map;
    private Random rand;

    public Solution(int[] nums) {
        map = new HashMap<>();
        rand = new Random();
        for (int i = 0; i < nums.length; i++) {
            map.computeIfAbsent(nums[i], k -> new ArrayList<>()).add(i);
        }
    }

    public int pick(int target) {
        List list = map.get(target);
        return list.get(rand.nextInt(list.size()));
    }
}
/*
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(nums);
 * int param_1 = obj.pick(target);
 */




© 2015 - 2025 Weber Informatics LLC | Privacy Policy