На самом деле очень важно, чтобы ваши значения были от 1 до 100!Потому что с вектором размером 1,000,000 у вас много одинаковых чисел, и вам не нужно проверять их все!Что вы можете сделать, это следующее:
Примечание: следующий код является лишь наброском!В ней может отсутствовать достаточная проверка ошибок, и она здесь, чтобы дать вам идею, а не для вставки копии!
Примечание 2: Когда я писал ответ, я предполагал, что числа находятся в диапазоне [0, 99].Затем я прочитал, что они на самом деле в [1, 100].Очевидно, что это не проблема, и вы можете либо -1 на все числа, либо даже лучше, изменить все 100 на 101.
bool exists[100] = {0}; // exists[i] means whether i exists in your vector
for (unsigned int i = 0, size = vect.size(); i < size; ++i)
exists[vect[i]] = true;
Затем вы делаете то же, что делали раньше:
for(unsigned int x = 0; x < 98; x++)
if (exists[x])
for(unsigned int y = x+1; y < 99; y++)
if (exists[y])
for(unsigned int z = y+1; z < 100; z++)
if (exists[z])
{
// {x, y, z} is an answer
}
Еще одна вещь, которую вы можете сделать, это потратить больше времени на подготовку, чтобы меньше времени создавать пары.Например:
int nums[100]; // from 0 to count are the numbers you have
int count = 0;
for (unsigned int i = 0, size = vect.size(); i < size; ++i)
{
bool exists = false;
for (int j = 0; j < count; ++j)
if (vect[i] == nums[j])
{
exists = true;
break;
}
if (!exists)
nums[count++] = vect[i];
}
Тогда
for(unsigned int x = 0; x < count-2; x++)
for(unsigned int y = x+1; y < count-1; y++)
for(unsigned int z = y+1; z < count; z++)
{
// {nums[x], nums[y], nums[z]} is an answer
}
Давайте рассмотрим переменную 100, поэтому назовем ее k
, а фактические числа, представленные в массиве, будут m
(который меньше или равен k
).
При первом способе у вас есть O(n)
подготовка и O(m^2*k)
операции для поиска достаточно быстрого значения.
Во втором методе у вас есть O(nm)
подготовка и O(m^3)
для генерации значений.Учитывая ваши значения для n
и m
, подготовка занимает слишком много времени.
Вы могли бы фактически объединить два метода, чтобы получить лучшее из обоих миров, что-то вроде этого:
int nums[100]; // from 0 to count are the numbers you have
int count = 0;
bool exists[100] = {0}; // exists[i] means whether i exists in your vector
for (unsigned int i = 0, size = vect.size(); i < size; ++i)
{
if (!exists[vect[i]])
nums[count++] = vect[i];
exists[vect[i]] = true;
}
Тогда:
for(unsigned int x = 0; x < count-2; x++)
for(unsigned int y = x+1; y < count-1; y++)
for(unsigned int z = y+1; z < count; z++)
{
// {nums[x], nums[y], nums[z]} is an answer
}
Этот метод имеет O(n)
подготовку и O(m^3)
стоимость для поиска уникальных триплетов.
Редактировать: Оказалось, чтодля OP одно и то же число в разных местах считается разными значениями.Если это действительно так, то извините, более быстрого решения нет.Причина в том, что все возможные комбинации C(n, m)
(это комбинация ), что, хотя вы генерируете каждую из них в O(1)
, она все еще слишком велика для вас.