有效地获取C++链表中最大的3个整数(未排序)
Efficiently get largest 3 integers in C++ Linked List (unsorted)
我听说有些std函数确实给出了数组中最大的n个整数,但链表呢?
我认为一个解决方案是有几个for循环来迭代链表,但似乎在C++库中可以有一个更简单的解决方案。
谢谢。
如果你不能使用另一种数据结构:,我会这样做
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;
}
}
也许可以考虑使用priority_queue
。
基本思想是维护一个完全由N
数字组成的排序列表、优先级队列或堆。您将列表中的第一个N
值推入其中,然后对其余值进行迭代。如果您遇到的项目大于队列中的最小值(或其他值(,则删除该元素并将新元素推入。
如果您只是在寻找N=3
,那么使用简单的数组可能比优先级队列或其他任何东西都要好。只需进行两次比较,就可以确定该数组中的哪个元素是最小的。你总是记得最小元素的索引,只有当你替换它时才会更新它
有趣的是,对于按升序排序的列表,这种方法的性能最差。然而,它本质上仍然是线性时间复杂性。
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- C++ 如何比较n个排序的整数向量以找到互元素?
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 如何从字符串C++读取多个整数
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 有没有更好的方法对C++中的三个整数进行排序?
- 为什么将两个浮点数相加会得到一个整数C++?
- 编写一个读取五个整数并执行一些任务的C++程序
- 从两个 4x64 位整数数组中获取取模
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 比较两个整数在C++中与未知 int 类型的相等性
- 如何忽略输入中的 N 个整数
- 查找多个向量之间的公共元素(无整数元素)
- 如何更好地表示 6 个整数键而不是作为 6 维数组的索引?
- 在 1.5 秒内找到 3 到 4 个不同整数的中位数超过 2000 万