Определите, существует ли A + B = C в массиве из n целых чисел

Это проблема, которую мой друг получил в качестве домашнего задания (в классе алгоритмов и структур данных). Он спросил меня об этом. Однако я не могу ее решить, и в течение последних нескольких дней я думал об этом некоторое время.

Есть n случайных целых чисел в диапазоне [0, 2 31 ] -1] (могут быть дубликаты. Определите, удовлетворяют ли 3 числа из этих чисел A + B = C .

Сначала я придумал наивный алгоритм, который является O ( n 2 log n ). Затем я придумал алгоритм O ( n 2 ). Вот псевдокод:

sort(a); // non-descending
for (i = 0; i < n; i++) {
  j = i; k = i + 1;
  while (j < n && k < n) {
    if (a[i] + a[j] == a[k])
      return true;
    else if (a[i] + a[k] < a[j])
      k++;
    else
      j++;
  }
}
return false;

Однако проблема утверждает, что 1 < n <= 10 6 . Я считаю, что O ( n 2 ) слишком медленный. Мое решение не использует случайность. Однако я не уверен, что это важная часть проблемы.

16
задан Gilles 'SO- stop being evil' 15 September 2012 в 22:55
поделиться