Ответ предполагает, что вы выбрали следующий алгоритм.
0) Отсортируем массив. Заведем переменную max_product, которую проинициализируем значением -1.
1) Далее будем перебирать элементы массива и для каждого элемента arr[i] находить все тройки с нулевой суммой, в которых он участвует. Искать будем только правее i, поскольку все остальные тройки мы нашли бы на предыдущих шагах. Делаем это так:
2) Смотрим на хвост массива начиная с элемента i+1. В качестве двух недостающих элементов тройки возьмем первый и последний элемент этого хвоста: left = i+1, right = len(arr) - 1.
3) Сложим три элемента arr[i], arr[left], arr[right].
4) Если сумма получилась положительной, сдвинем right на единицу влево. Поскольку массив изначально отсортирован, это позволит уменьшить сумму трех элементов.
5) Иначе, если сумма отрицательная - сдвинем left на единицу вправо.
6) Если же сумма была нулевой — тройка нам подходит, посчитаем произведение элементов и обновим max_product, если новое произведение получилось больше. Затем не забудем сдвинуть left на единицу влево, а right — вправо.
7) Если left всё еще меньше right - вернемся к пункту 2.
Сложность алгоритма будет O(n²)
Разберемся, почему:
0) На встроенную сортировку тратим O(nlogn). Сортировкам будет посвящена отдельная тема, в соответствующем уроке разберемся, почему сложность именно такая)
1) Перебираем все элементы массива в цикле, кроме последних двух - O(n)
2) На каждом шаге i этого цикла смотрим на все элементы справа от позиции i.
Для нулевого элемента массива рассмотрим максимум n - 2 суммы троек. Максимум будет достигнут, если все время будем сдвигать только один указатель.
Для первого элемента - максимум n - 3 суммы троек.
Для элемента на позиции n - 2 - всего одну тройку.
Можно обобщить эти рассуждения: на позиции i в худшем случае будет просмотрено n - i - 2 суммы.
3) Просуммируем значения (n - i - 2) для каждого i от 0 до n - 2. Для этого воспользуемся суммой арифметической прогрессии. В итоге получим выражение (n - 1)(n - 2) / 2.
То есть сложность алгоритма O(n²)