Вы можете создать новый вектор, который содержит индексы скрытого вектора, а затем отсортировать его, используя открытый метод iLessThanj()
скрытого вектора.Наконец, просмотрите отсортированные индексы, чтобы найти пару одинаковых элементов, они являются смежными после сортировки и iLessThanj(i, i+1) == false
для них и только для них.
Это имеет сложность O (nlogn) во времени и O (n) в памяти.
hiddenVector a; // {1, 3, -2, -4, 3, 7} for example
// construct indexes array
std::vector<int> a_ind (a.getSize ());
for (int i = 0; i < a.getSize(); i++)
a_ind[i] = i;
// now a_ind = {0, 1, 2, 3, 4, 5}
// sort it
std::sort(begin(a_ind), end(a_ind),
[&a] (int i, int j) { return a.iLessThanj(i, j); }
);
// now a_ind = {3, 2, 0, 1, 4, 5}
// and it is equal to sequence of indexes in sorted hidden vector
// finally, compute an answer to your problem
std::pair<int, int> res = {};
for (int k = 0; k < a_ind.size()-1; k++) {
int i = a_ind[k];
int j = a_ind[k+1];
if (!a.iLessThanj(i, j)) {
res.first = i;
res.second = j;
break;
}
}
// now res = {1, 4}
PS Результаты Speedtest для обсуждения в комментариях (скомпилировано и запущено с -O3):
N squared_algo sublinear_algo
10 2.259e-07 1.1653e-06
100 4.8259e-06 8.5859e-06
1000 0.000218602 0.000118063
10000 0.0138744 0.000718756
100000 0.913739 0.00876182
Полный код быстрого теста здесь