题目:
给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。
注意:
数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。
示例:
int[] nums = new int[] {1,2,3,3,3};
Solution solution = newSolution(nums);// pick(3) 应该返回索引 2,3 或者 4。每个索引的返回概率应该相等。 solution.pick(3);
// pick(1) 应该返回 0。因为只有nums[0]等于1。 solution.pick(1);
简单介绍:
题目:随机数索引
题目难度:中等
使用语言:JAVA。
这道题来自leetcode题库的蓄水池抽样标签。
解题思路:
首先看题、分析题意,我们可以明确1个关键点:
1.如何实现随机返回索引
既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题,
数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
该题的数据结构的作用:
1.设置一个ArrayList来保存索引数
2.申请一个随机数对象,用于生成随机数
算法:
既然明确了我们的数据结构,我们就可以开始我们的算法分析了。
1.对象初始化。
2.遍历数组,寻找索引,保存入arrayList。
3.利用随机数,随机在arrayList取得一个索引数
代码部分:
import java.util.ArrayList;
import java.util.Random;
class Solution {
ArrayList<Integer> arrayList=new ArrayList<>();
int []nums;
public Solution(int[] nums) {
this.nums=new int[nums.length];
this.nums=nums;
}
public int pick(int target) {
Random random=new Random();
for(int i=0;i<this.nums.length;i++){
if(target==this.nums[i]){
arrayList.add(i);//保存索引
}
}
//返回[0,arrayList.size()-1]的正整数
return arrayList.get(random.nextInt(arrayList.size()));
}
}
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(nums);
* int param_1 = obj.pick(target);
*/
结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!