Максимум в срезе находится за один проход. Мы заводим переменную под текущий максимум, кладём в неё первый элемент и дальше идём по остальным, сравнивая каждый с накопленным значением. Если встретили больше, обновляем.
Один проход по n элементам даёт сложность O(n), и меньше уже не получится, потому что любой элемент может оказаться максимальным, а значит его придётся хотя бы прочитать.
В стандартной библиотеке есть
slices.Max, который делает ровно то же самое за O(n).🐸 Библиотека Go для собеса