LeetCode解析------398.隨機數索引-蓄水池抽樣

題目:

給定一個可能含有重複元素的整數數組,要求隨機輸出給定的數字的索引。 您可以假設給定的數字一定存在於數組中。

注意:
數組大小可能非常大。 使用太多額外空間的解決方案將不會通過測試。

示例:

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);
 */

在這裏插入圖片描述

結語:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章