Учитывая MxN матрица, это O(MN)
, что является оптимальным.
INIT rowMin = [ +Infinify ] xM
INIT colMax = [ -Infinity ] xN
FOR r = 1..M
FOR c = 1..N
rowMin[r] = MIN(rowMin[r], mat[r][c])
colMax[c] = MAX(colMax[c], mat[r][c])
FOR r = 1..M
FOR c = 1..N
IF mat[r][c] == rowMin[r] == colMax[c]
DECLARE saddlePoint(r, c)
Почему это оптимально?
Поскольку существуют значения MxN , и на каждое из них необходимо обратить внимание, поэтому для того, чтобы ваш ответ был определенным (т.е. не вероятностным), нижняя граница равна O(MN)
.
Можно ли это оптимизировать дальше?
Вы можете немного оптимизировать это. Это все равно будет O(MN)
, но вместо того, чтобы находить максимальные / минимальные значения , вместо этого вы найдете их индексы . Это может сделать вторую фазу O(M)
в лучшем случае (то есть, когда в строке / столбце есть уникальный минимум / максимум).
Обратите внимание, что в худшем случае есть O(MN)
седловые точки: тогда все числа в массиве равны.