leetcode398随机数索引

leetcode 398 Random Pick Index

Posted by BY on June 24, 2020

前言

持续更新了

正文

问题来源

本问题来自leetcode上的398题。

问题描述

给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。

示例 1:

int[] nums = new int[] {1,2,3,3,3};
Solution solution = new Solution(nums);

// pick(3) 应该返回索引 2,3 或者 4。每个索引的返回概率应该相等。
solution.pick(3);

// pick(1) 应该返回 0。因为只有nums[0]等于1。
solution.pick(1);

分析:

type Solution struct {
    M map[int]*[]int
}


func Constructor(nums []int) Solution {
    m := make(map[int]*[]int)
    for i, v := range nums {
        sp, ok := m[v]
        if ok {
            *sp = append(*sp, i)
        } else {
            sp = new([]int)
            m[v] = sp // 这句没写导致一直运行报使用非法指针
            *sp = append(*sp, i)
        }
    }
    return Solution{m}
}


func (this *Solution) Pick(target int) int {
    rand.Seed(time.Now().UnixNano())
    a := this.M[target]
    return (*a)[rand.Intn(len(*a))]
}

总结:

勤思考。

结语

不管怎么样好好加油。