【发布时间】:2014-03-10 03:49:58
【问题描述】:
这是我最近遇到的面试问题之一。程序返回数组中最大数的索引[注意:数组可能包含也可能不包含最大数的多个副本],使得每个索引(包含最大数)具有最大数的 1/no 的概率被退回。
例子:
- [-1 3 2 3 3],每个位置[1,3,4]都有1/3的概率被返回(三个3)
- [2 4 6 6 3 1 6 6],[2,3,6,7]中的每一个都有1/4的概率被返回(对应6s的位置)。
首先,我给出了 O(n) 时间和 O(n) 空间算法,在该算法中我收集了一组最大索引,然后从该集合中返回一个随机数。但他要求 O(n) 时间和 O(1) 复杂度程序,然后我想出了这个。
int find_maxIndex(vector<int> a)
{
max = a[0];
max_index = 0;
count = 0;
for(i = 1 to a.size())
{
if(max < a[i])
{
max = a[i];
count = 0;
}
if(max == a[i])
{
count++;
if(rand < 1/count) //rand = a random number in the range of [0,1]
max_index = i;
}
}
return max_index;
}
我给了他这个解决方案。但我怀疑这个过程是否会以相等的概率选择最大数的索引之一。希望我很清楚。还有其他方法可以做到这一点吗?
【问题讨论】:
标签: algorithm