【发布时间】:2019-05-09 04:52:37
【问题描述】:
这是我看到的一个面试问题,没有很好的解决方案。
问题的第一部分是:
给定一个整数向量,找到最大值的索引。但是,如果有多个最大值 - 您希望最大值的每个索引都有相同的概率被选择。
例如:如果我们有向量 (0,1,2,2,2,2) ,那么索引 2 的概率为 0.25(索引 3、4、5 也是如此)。
你可以像这样在 C++ 中解决它:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int getIndex(const vector<int>& numbers) {
int maxNum = numeric_limits<int>::min();
size_t idx = -1;
size_t maxNumCtr = 0;
for(size_t i = 0; i<numbers.size(); ++i) {
int num = numbers[i];
if(num > maxNum) {
idx = i;
maxNum = num;
maxNumCtr = 1;
} else if (num == maxNum) {
maxNumCtr ++;
idx = ((rand() % maxNumCtr) == 0) ? i : idx;
}
}
return idx;
}
第二部分是:
现在你有一个额外的函数参数,它指示向量中最大值的出现次数。尝试改善您编写的算法的运行时间。
我的想法是,您可以在函数开始时只计算一次 rand() 以找到均匀分布的最大索引,并使用一些计数器变量来了解何时在循环中获得正确的最大索引。但这并没有提高运行时间,因为rand 在O(1) 中运行。
有更好的主意吗?
【问题讨论】:
-
嗯,第一个算法已经是
O(n),你不能再低了,因为你需要读取每个元素,所以我想说你不能提高算法的运行时复杂度(我认为这里的“运行时间”是什么意思)。 -
#include <bits/stdc++.h>-- 这是一个面试问题 -- 好吧,如果这是一个 C++ 编程职位,任何称职的公司都会拒绝这个。
标签: c++ algorithm performance