这是我的解决方案的一些不完整代码。它只需要通过向量 1 次。这将在相对于 vec 的线性时间内运行。希望它可以解决问题。我之前的文字有点啰嗦。我把它留在了这个来源下面。
int iterative_kth_element(vector<int>& vec, size_t k)
{
int mins[k];
//assume first k elements are min
for(int i=0; i<k; i++)
{
mins[i] = vec[i];
}
//TODO:
//sort mins array here
//bubble sort is okay if k is small, or pivot
for(int i=k; i < vec.size(); i++)
{
//since mins is sorted, mins[k-1] is the highest value
if(vec[i] < mins[k-1])
{
mins[k-1] = vec[i];
}
//TODO:
//sort mins array here
//you could do a slick bubble sort starting from
//the back of mins until you find the location
//for the new min item
}
return mins[k-1];
}
//上一个文本
如果您要找到第 k 个最小的项目。您应该使用第一个 k 项初始化一个数组。或者将索引存储到找到最小项目的 vec 中。(将从 0、1、2、3、...、k 开始)
int index = 0;
int min = vec[0];
应该
int* mins = new int[k];
for(int i=0; i < k; i++) {
mins[i] = vec[i];
}
我还建议对这个由 k 个最小整数组成的数组进行排序。如果您知道最大的项目在哪里,您只需将 vec 中的每个元素与以分钟为单位的最大项目进行对比。不过,您将需要一个排序方法,每次您发现小于您的分钟数时都会调用该方法。
在 vec 的一次迭代之后,您应该在该数组中有 k 个最小的项目。只需返回最大的项目。存储在阵列中的位置 0 或 k-1。
还有一点需要注意:如果 k 大于 vec.size() / 2,你应该寻找 (vec.size() - k) 最大的项。
这应该是 log(k*n) 时间,最大内存占用为 1.5n(k 正好是 vec.size()/2 的情况是最坏的情况)。
其中 n 是 vec 的大小,k 是函数中的参数。(如果您实现该注释,则 k 的上限为 n/2)。
最坏的情况是得到一个按降序排列的数字列表,其中 k 是 n 的一半。