我听说有些std函数确实给出了数组中最大的n个整数,但链表如何呢?
我认为解决方案是让一些for循环迭代链表,但似乎C ++库中可能有一个更简单的解决方案。
感谢。
答案 0 :(得分:2)
如果您不能使用其他数据结构,我会这样做:
typedef std::list<int> IntList;
InstList list = <your_values>;
int top[3];
for (size_t i = 0; i < 3; i++)
top[i] = std::numeric_limits<int>::min();
IntList::iterator it, end;
for (it = list.begin(), end = list.end(); it != end; ++it) {
const int& value = *it;
if (value > top[2]) {
top[0] = top[1];
top[1] = top[2];
top[2] = value;
} else if (value > top[1]) {
top[0] = top[1];
top[1] = value;
} else if (value > top[0]) {
top[0] = value;
}
}
答案 1 :(得分:1)
或许考虑使用priority_queue
。
答案 2 :(得分:1)
基本思想是维护一个完整N
个数字的排序列表,优先级队列或堆。您将列表的第一个N
值推入其中,然后迭代余数。如果您遇到的项目大于队列中的最小值(或其他),则删除该元素并将其推入。
如果您只是在寻找N=3
,那么使用简单数组可能比优先级队列或其他任何东西更好。只需两次比较,就可以确定该数组中的哪个元素是最小的。您始终记住最小元素的索引,并且仅在替换它时更新它。
有趣的是,对于按升序排序的列表,此方法的性能最差。但是,它仍然基本上是线性时间复杂度。