Mutating counts without cleanup
Wrong move: Zero-count keys stay in map and break distinct/count constraints.
Usually fails on: Window/map size checks are consistently off by one.
Fix: Delete keys when count reaches zero.
Move from brute-force thinking to an efficient approach using hash map strategy.
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 - 1target is an integer from nums.104 calls will be made to pick.Problem summary: 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.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Hash Map · Math
["Solution","pick","pick","pick"] [[[1,2,3,3,3]],[3],[1],[3]]
linked-list-random-node)random-pick-with-blacklist)random-pick-with-weight)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #398: Random Pick Index
class Solution {
private int[] nums;
private Random random = new Random();
public Solution(int[] nums) {
this.nums = nums;
}
public int pick(int target) {
int n = 0, ans = 0;
for (int i = 0; i < nums.length; ++i) {
if (nums[i] == target) {
++n;
int x = 1 + random.nextInt(n);
if (x == n) {
ans = i;
}
}
}
return ans;
}
}
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(nums);
* int param_1 = obj.pick(target);
*/
// Accepted solution for LeetCode #398: Random Pick Index
type Solution struct {
nums []int
}
func Constructor(nums []int) Solution {
return Solution{nums}
}
func (this *Solution) Pick(target int) int {
n, ans := 0, 0
for i, v := range this.nums {
if v == target {
n++
x := 1 + rand.Intn(n)
if n == x {
ans = i
}
}
}
return ans
}
/**
* Your Solution object will be instantiated and called as such:
* obj := Constructor(nums);
* param_1 := obj.Pick(target);
*/
# Accepted solution for LeetCode #398: Random Pick Index
class Solution:
def __init__(self, nums: List[int]):
self.nums = nums
def pick(self, target: int) -> int:
n = ans = 0
for i, v in enumerate(self.nums):
if v == target:
n += 1
x = random.randint(1, n)
if x == n:
ans = i
return ans
# Your Solution object will be instantiated and called as such:
# obj = Solution(nums)
# param_1 = obj.pick(target)
// Accepted solution for LeetCode #398: Random Pick Index
use rand::prelude::*;
struct Solution {
rng: ThreadRng,
nums: Vec<i32>,
}
impl Solution {
fn new(nums: Vec<i32>) -> Self {
let rng = thread_rng();
Solution { rng, nums }
}
fn pick(&mut self, target: i32) -> i32 {
let n = self.nums.len();
let mut count = 0;
let mut res = 0;
for i in 0..n {
if self.nums[i] == target {
count += 1;
if self.rng.gen_range(0, count) == 0 {
res = i;
}
}
}
res as i32
}
}
// Accepted solution for LeetCode #398: Random Pick Index
// Auto-generated TypeScript example from java.
function exampleSolution(): void {
}
// Reference (java):
// // Accepted solution for LeetCode #398: Random Pick Index
// class Solution {
// private int[] nums;
// private Random random = new Random();
//
// public Solution(int[] nums) {
// this.nums = nums;
// }
//
// public int pick(int target) {
// int n = 0, ans = 0;
// for (int i = 0; i < nums.length; ++i) {
// if (nums[i] == target) {
// ++n;
// int x = 1 + random.nextInt(n);
// if (x == n) {
// ans = i;
// }
// }
// }
// return ans;
// }
// }
//
// /**
// * Your Solution object will be instantiated and called as such:
// * Solution obj = new Solution(nums);
// * int param_1 = obj.pick(target);
// */
Use this to step through a reusable interview workflow for this problem.
For each element, scan the rest of the array looking for a match. Two nested loops give n × (n−1)/2 comparisons = O(n²). No extra space since we only use loop indices.
One pass through the input, performing O(1) hash map lookups and insertions at each step. The hash map may store up to n entries in the worst case. This is the classic space-for-time tradeoff: O(n) extra memory eliminates an inner loop.
Review these before coding to avoid predictable interview regressions.
Wrong move: Zero-count keys stay in map and break distinct/count constraints.
Usually fails on: Window/map size checks are consistently off by one.
Fix: Delete keys when count reaches zero.
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.