leetcode:Linked List Random Node…

Linked List Random Node:
给定一个链表数组,随机返回其中一个元素,要求返回所有元素的可能性一致。
满足这个要求很简单,求出链表的长度,然后根据长度设置随机值,再返回对应位置的元素即可。
然后就是进阶要求:无法得到链表的长度,依然要求等概率随机返回。
这个就涉及一个经典的算法,水塘抽样,步骤如下:
1、把第一个样本放入ans
2、对于接下来每个样本a[j],从1-j随机抽一个数a,如果a==1那么就把a[j]替换到ans
这是因为对于元素a[j],它被返回的概率是:抽中aj的概率*a[j]之后的元素都没被抽中的概率。
leetcode:Linked <wbr>List <wbr>Random <wbr>Node <wbr>+ <wbr>Top <wbr>K <wbr>Frequent <wbr>Elements <wbr>+ <wbr>Count <wbr>Numbers <wbr>with <wbr>Unique <wbr>Digits
每个数被抽中的概率均是1/n。同理可以推广到,随机取k个数的情况(随机数a

Top K Frequent Elements:
求数组中出现次数最多的前K个元素,思路还是挺简单,不过我用的是vector+sort,居然忘记还有priority_queue这种优先队列型的容器。

Count Numbers with Unique Digits:
找出所有不含重复字符的数。我的思路是先找出含重复字母的,一直卡住,后来看解析才知道,换个角度想,直接找不重复字符的数要更直接,因为可以逐位考虑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值