Вы можете попробовать подход с раздвижными окнами.Сначала отсортируйте все числа по возрастанию, а затем используйте два целых числа begin
и end
, чтобы проиндексировать текущую пару чисел.Инициализируйте begin
до 0 и end
до последней позиции.Затем сравните произведение v[begin]
и v[end]
с P
:
- Если оно равно, вы нашли ответ.
- Если оно ниже, вы должны найтиЧтобы увеличить продукт, двигайтесь на
begin
вперед. - Если оно выше, вы должны найти продукт меньшего размера, двигайтесь на
end
назад.
Вот код C ++ сидея реализована.Это решение O (n * log (n)) из-за сортировки, если вы можете предположить, что данные отсортированы, то вы можете пропустить сортировку для решения O (n).
pair<int, int> GetProductPair(vector<int>& v, int P) {
sort(v.begin(), v.end());
int begin = 0, end = static_cast<int>(v.size()) - 1;
while (begin < end) {
const int prod = v[begin] * v[end];
if (prod == P) return make_pair(begin, end);
if (prod < P) ++begin;
else --end;
}
return make_pair(-1, -1);
}