python随机列表的索引_398. 随机数索引(Python)

题目

难度:★★☆☆☆

类型:数组

方法:数学

力扣链接请移步本题传送门

更多力扣中等题的解决方案请移步力扣中等题目录

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

注意:

数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。

示例:

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

解答

这是一个随机采样问题。我们在初始化时构造一个字典,用来统计所有数字出现的下标。字典的键是数字,值是该数字所在的位置,由于数字可能有重复,所以数字出现的位置可能有很多,因此用列表的形式给出。

在调用时,选取该数字出现的位置列表,然后进行随机采样即可。

import random

class Solution:

def __init__(self, nums):

self.num_dict = dict()

for index, num in enumerate(nums):

if num not in self.num_dict.keys():

self.num_dict.update({num: [index]})

else:

self.num_dict[num].append(index)

def pick(self, target: int) -> int:

index_list = self.num_dict[target]

selected_index = int(random.random() * len(index_list))

return index_list[selected_index]

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值