Если мы ничего не предполагаем о структуре bad_array
, ваш код оптимален по аргументу противника. Если мы знаем, что каждый столбец отсортирован в порядке возрастания, то, как только мы достигнем значения, превышающего максимальное, мы узнаем, что каждый последующий элемент в этом столбце также выше предела, но если у нас нет такого предположения, мы просто имеем проверить каждый.
Если вы решите отсортировать каждый столбец первым, это займет (n столбцов * nlogn) время, которое уже больше, чем n * n времени, необходимого для проверки каждого элемента.
Вы также можете создать good_array
, проверяя и копируя по одному элементу за раз, вместо копирования всех элементов из bad_array
и проверки их позже. Это должно примерно сократить время в 0,5 раза