¶第一题
这个挺简单的,就是用一个数组记录所有内容,然后随机就完事了:
1 |
|
但这并不是我们想要的,这道题原始是希望不知道数据总体有多大时,也能做到随机取样(不能加载所有数据时)
¶蓄水池抽样算法
即:当内存无法加载全部数据时,如何从包含未知大小的数据流中随机选取k个数据,并且要保证每个数据被抽取到的概率相等。
当 k = 1 时,即此题的情况
也就是说,我们每次只能读一个数据。
假设数据流含有N个数,我们知道如果要保证所有的数被抽到的概率相等,那么每个数抽到的概率应该为 1/N
那如何保证呢?
先说方案:
每次只保留一个数,当遇到第 i 个数时,以 1/i的概率保留它,(i-1)/i的概率保留原来的数。
举例说明: 1 - 10
遇到1,概率为1,保留第一个数。
遇到2,概率为1/2,这个时候,1和2各1/2的概率被保留
遇到3,3被保留的概率为1/3,(之前剩下的数假设1被保留),2/3的概率 1 被保留,(此时1被保留的总概率为 2/3 * 1/2 = 1/3)
遇到4,4被保留的概率为1/4,(之前剩下的数假设1被保留),3/4的概率 1 被保留,(此时1被保留的总概率为 3/4 * 2/3 * 1/2 = 1/4)
以此类推,每个数被保留的概率都是1/N。
代码为:
1 | class Solution { |
¶第二题 1220
这里就是个dp或者用矩阵快速幂
dp
1 | class Solution { |
快速幂
待查,以后再补这一点吧
¶第三题 539
先排序,然后转换为分钟,再遍历:
1 | class Solution { |
¶第四题 219
hashmap 的巧妙利用
1 | class Solution { |
¶第五题 2029
这题并不知道怎么做,抄的,待查
1 | class Solution { |
¶第六题 1345
这题也待查吧,先放在这里:
1 | class Solution { |
¶第七题
这个太简单了,就判断一下是不是回文,如果是,一步就够了,如果不是,也就两步。
1 | class Solution { |