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);
用一个List保存可能的索引值,然后用Random输出,原本以为用的空间太多通不过,结果可行。。。
public class Solution {
int[] copy = null;
Random random = null;
public Solution(int[] nums) {
copy = nums;
random = new Random();
}
public int pick(int target) {
List<Integer> list = new ArrayList<>();
for(int i=0; i<copy.length; i++){
if(copy[i]==target){
list.add(i);
}
}
return list.get(random.nextInt(list.size()));
}
}
其实可以不用List的空间,可以像LinkedList那题一样,根据蓄水池问题的概率来取舍
public class Solution {
int[] nums;
Random rnd;
public Solution(int[] nums) {
this.nums=nums;
rnd=new Random();
}
public int pick(int target) {
int result=0,count=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=target)
continue;
if(rnd.nextInt(++count)==0)
result=i;
}
return result;
}
}