s*f
2 楼
原题是:
Implement below function.
int getRandom(int N, int K[])
Constraints:
->K is sorted and contains elements in range [0,N)
->Output should be a random number between [0,N) excuding elements from K
->probability of generated number should be 1/(N-K.length) and not 1/N
-->int uniform(int N) is given which returns random number [0,N) with 1/N
probability for each number.
->No more than O(1) memory
->No more than O(N) time
提供的解法是:
public int randomNumber(int N, int[] K) { // K is sorted
int x = uniform(N - K.length); // 1 .. N - K.length
int last = 0 , i;
for (i = 0; i < K.length; i++) {
if (K[i] - last > x)
return x + last;
x -= (K[i] - last - 1); // we've seen K[i] - last - 1 valid
numbers
last = K[i];
}
return x + K[ K.length-1 ];
}
概率不好,请大家解释下这个算法什么意思,谢谢。
Implement below function.
int getRandom(int N, int K[])
Constraints:
->K is sorted and contains elements in range [0,N)
->Output should be a random number between [0,N) excuding elements from K
->probability of generated number should be 1/(N-K.length) and not 1/N
-->int uniform(int N) is given which returns random number [0,N) with 1/N
probability for each number.
->No more than O(1) memory
->No more than O(N) time
提供的解法是:
public int randomNumber(int N, int[] K) { // K is sorted
int x = uniform(N - K.length); // 1 .. N - K.length
int last = 0 , i;
for (i = 0; i < K.length; i++) {
if (K[i] - last > x)
return x + last;
x -= (K[i] - last - 1); // we've seen K[i] - last - 1 valid
numbers
last = K[i];
}
return x + K[ K.length-1 ];
}
概率不好,请大家解释下这个算法什么意思,谢谢。
u*n
3 楼
summer的活动
24 nights才给71K
只有第一个好点
7,000 BONUS POINTS
When you stay your first night by May 31, 2016
24 nights才给71K
只有第一个好点
7,000 BONUS POINTS
When you stay your first night by May 31, 2016
l*n
4 楼
天哪,我简直要疯了,我的儿子最近不知道受什么刺激了,他告诉我自己想变性。他想
当个女孩,作为母亲我听到之后肯定很生气,我觉得他脑子有病,好端端的变什么性,
而且这样会让别人觉得这个孩子有点变态。
他说他就是想变成女孩,你看看那谁谁不是也变成女人了吗,还给我各种举例子。你说
这不是脑子有问题是什么,人家有钱你有吗,再说了儿子是我们家唯一的一个独苗,现
在竟然要变成女孩子这不是搞笑吗?
反正我是肯定不能答应的,况且他现在还这么小知道什么是变性吗?他知道如果真的变
性了意味着什么吗,一个小屁孩整天不知道好好的学习就想这些乱七八糟的事情。他还
信誓旦旦的说这个是他的梦想,他一定要变成女孩子。我说你这就是脑子有病,还变性。
说实话我当时真的是内心的火不打一起处来啊,整天都不知道看的什么乱七八糟的东西
,我就告诉他你还是好好的学习吧,别在想着什么变性了。你们说说现在这个年龄段的
孩子是不是整天都会想一些连七八糟的事情啊。
当个女孩,作为母亲我听到之后肯定很生气,我觉得他脑子有病,好端端的变什么性,
而且这样会让别人觉得这个孩子有点变态。
他说他就是想变成女孩,你看看那谁谁不是也变成女人了吗,还给我各种举例子。你说
这不是脑子有问题是什么,人家有钱你有吗,再说了儿子是我们家唯一的一个独苗,现
在竟然要变成女孩子这不是搞笑吗?
反正我是肯定不能答应的,况且他现在还这么小知道什么是变性吗?他知道如果真的变
性了意味着什么吗,一个小屁孩整天不知道好好的学习就想这些乱七八糟的事情。他还
信誓旦旦的说这个是他的梦想,他一定要变成女孩子。我说你这就是脑子有病,还变性。
说实话我当时真的是内心的火不打一起处来啊,整天都不知道看的什么乱七八糟的东西
,我就告诉他你还是好好的学习吧,别在想着什么变性了。你们说说现在这个年龄段的
孩子是不是整天都会想一些连七八糟的事情啊。
c*e
6 楼
It is filled all empty slot with n - k
for example
k = {0, 2, 5} n = 6
Uniform(30 generate random 0 - 3 and mapped to the empty slot as 1, 3, 4 .
for example
k = {0, 2, 5} n = 6
Uniform(30 generate random 0 - 3 and mapped to the empty slot as 1, 3, 4 .
e*3
9 楼
说到底这个算法就是迅速根据Uniform(N-K.length)的结果r,找到第r个不在K内部,
但是小于N的数字,最原始的版本是O(N-K.length)复杂度,就是按照顺序在N-K这个
集合里面找对应的数字,但是这样效率太低。
底下的程序就是每个K内部的元素为跳板迅速向前跳跃找到下一个对应的数字,这句话
是精髓:
x -= (K[i] - last - 1); // we've seen K[i] - last - 1 valid numbers
注意这个-1很关键,没有-1的话x + K[ K.length-1]就会是K里面的数字,有了-1的
话,每遇到K里面的一个数字,x + K[ K.length-1]会加1。
【在 s***f 的大作中提到】
: 原题是:
: Implement below function.
: int getRandom(int N, int K[])
: Constraints:
: ->K is sorted and contains elements in range [0,N)
: ->Output should be a random number between [0,N) excuding elements from K
: ->probability of generated number should be 1/(N-K.length) and not 1/N
: -->int uniform(int N) is given which returns random number [0,N) with 1/N
: probability for each number.
: ->No more than O(1) memory
但是小于N的数字,最原始的版本是O(N-K.length)复杂度,就是按照顺序在N-K这个
集合里面找对应的数字,但是这样效率太低。
底下的程序就是每个K内部的元素为跳板迅速向前跳跃找到下一个对应的数字,这句话
是精髓:
x -= (K[i] - last - 1); // we've seen K[i] - last - 1 valid numbers
注意这个-1很关键,没有-1的话x + K[ K.length-1]就会是K里面的数字,有了-1的
话,每遇到K里面的一个数字,x + K[ K.length-1]会加1。
【在 s***f 的大作中提到】
: 原题是:
: Implement below function.
: int getRandom(int N, int K[])
: Constraints:
: ->K is sorted and contains elements in range [0,N)
: ->Output should be a random number between [0,N) excuding elements from K
: ->probability of generated number should be 1/(N-K.length) and not 1/N
: -->int uniform(int N) is given which returns random number [0,N) with 1/N
: probability for each number.
: ->No more than O(1) memory
h*6
12 楼
用O(N-k.length)的空间建一个对应表,然后每次查表就可以了。
l*8
15 楼
现在还是O(N-K.length)复杂度啊。
可以用O(log K.length)来做吧。
【在 e********3 的大作中提到】
: 说到底这个算法就是迅速根据Uniform(N-K.length)的结果r,找到第r个不在K内部,
: 但是小于N的数字,最原始的版本是O(N-K.length)复杂度,就是按照顺序在N-K这个
: 集合里面找对应的数字,但是这样效率太低。
: 底下的程序就是每个K内部的元素为跳板迅速向前跳跃找到下一个对应的数字,这句话
: 是精髓:
: x -= (K[i] - last - 1); // we've seen K[i] - last - 1 valid numbers
: 注意这个-1很关键,没有-1的话x + K[ K.length-1]就会是K里面的数字,有了-1的
: 话,每遇到K里面的一个数字,x + K[ K.length-1]会加1。
可以用O(log K.length)来做吧。
【在 e********3 的大作中提到】
: 说到底这个算法就是迅速根据Uniform(N-K.length)的结果r,找到第r个不在K内部,
: 但是小于N的数字,最原始的版本是O(N-K.length)复杂度,就是按照顺序在N-K这个
: 集合里面找对应的数字,但是这样效率太低。
: 底下的程序就是每个K内部的元素为跳板迅速向前跳跃找到下一个对应的数字,这句话
: 是精髓:
: x -= (K[i] - last - 1); // we've seen K[i] - last - 1 valid numbers
: 注意这个-1很关键,没有-1的话x + K[ K.length-1]就会是K里面的数字,有了-1的
: 话,每遇到K里面的一个数字,x + K[ K.length-1]会加1。
h*6
18 楼
我提的方法是O(1)啊,只要不限内存,想多快都可以啊。
l*8
24 楼
O(1) space, O(log m) time, where m is the length the K array:
int randomNumber(int N, int *K, int m) {
int x = uniform(N - m);
int low = 0, up = m;
while (low < up) {
int mid = low + (up-low)/2;
if (x <= K[mid] - mid)
up = mid;
else
low = mid + 1;
}
return x + up;
}
int randomNumber(int N, int *K, int m) {
int x = uniform(N - m);
int low = 0, up = m;
while (low < up) {
int mid = low + (up-low)/2;
if (x <= K[mid] - mid)
up = mid;
else
low = mid + 1;
}
return x + up;
}
d*r
26 楼
这里早上还得穿毛衣。
h*6
27 楼
厉害!
相关阅读
周一挖个坑,各位推爸妈们,如果你孩子将来和你一样,你遗憾吗几位帅哥原子弹炸出了孩子的3类问题,探索、求知和装Q。当娘当的太失败了。。。需要给孩子补牙么?小朋友的运动协调能力。“谢谢”和“不客气”在木头轨道上跑的电动火车头哀嚎一下瞧瞧人家三岁小孩,惭愧啊自己五音不全的人怎么帮娃练钢琴呀家有俩宝以上的请进我儿子老是粘着他妈妈求推荐一款jogging stroller大妈问题:孩子拉了吐了的衣服怎么清理如何discipline一岁的宝宝?纽约长岛的4岁小朋友的pre-K program同事的6岁小孩play 'piano man' on youtube母亲节快乐~版面人气包子贴 (转载)带两孩子回国,有问题请教