Вы можете довольно легко реализовать это с помощью дополнительного vector
и алгоритма nth_element
, который равен O(n)
time:
std::vector<int> const v = ...;
// create a vector of elements with original indexes
std::vector<std::pair<int,int>> res;
// populate the result vector
int k = 0;
for (int i : v)
res.push_back({i,k++});
// find the maximum 4 elements
std::nth_element(res.begin(), res.begin() + 4, res.end(),
[](auto const &a, auto const &b) { return a.first > b.first; });
Вот демонстрация .
Обратите внимание, что в этом решении используется O(n)
дополнительного места. Если N
становится большим, это может быть неправильным подходом для поиска только 4
самых больших элементов. Это по-прежнему хороший подход, если вам нужны M
самые большие элементы, где M
растет как N
.