在C ++链接列表中有效获得最大的3个整数(未排序)

时间:2013-03-12 23:02:17

标签: c++ linked-list

我听说有些std函数确实给出了数组中最大的n个整数,但链表如何呢?

我认为解决方案是让一些for循环迭代链表,但似乎C ++库中可能有一个更简单的解决方案。

感谢。

3 个答案:

答案 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,那么使用简单数组可能比优先级队列或其他任何东西更好。只需两次比较,就可以确定该数组中的哪个元素是最小的。您始终记住最小元素的索引,并且仅在替换它时更新它。

有趣的是,对于按升序排序的列表,此方法的性能最差。但是,它仍然基本上是线性时间复杂度。