Подсчёт количества нулей в упорядоченной квадратной матрице

Идите от правого верхнего угла: на единице сдвигайтесь влево, на нуле добавляйте количество элементов слева вместе с ним и переходите на следующую строку.

Короткий ответ

Что ответить на собеседовании

Идите от правого верхнего угла: на единице сдвигайтесь влево, на нуле добавляйте количество элементов слева вместе с ним и переходите на следующую строку.

Подробный разбор

Ответ с пояснениями

Условие

Реализуйте функцию count_zeros(), принимающую квадратную матрицу, заполненную только символами 0 и 1. В каждой строке и каждом столбце элементы расположены в неубывающем порядке (все нули находятся слева/вверху, а единицы — справа/внизу). Функция должна вернуть общее число нулей, присутствующих во всей матрице.

Пример

matrix = [
    [0, 0, 1, 1],
    [0, 1, 1, 1],
    [1, 1, 1, 1],
    [1, 1, 1, 1]
]
print(count_zeros(matrix))  # вывод: 3

Ответ

Идите от правого верхнего угла: на единице сдвигайтесь влево, на нуле добавляйте количество элементов слева вместе с ним и переходите на следующую строку.

def count_zeros(matrix):
    n = len(matrix)
    if any(len(row) != n for row in matrix):
        raise ValueError('Ожидалась квадратная матрица')
    row, column, total = 0, n - 1, 0
    while row < n and column >= 0:
        if matrix[row][column] == 0:
            total += column + 1
            row += 1
        else:
            column -= 1
    return total

Сортировка по строкам гарантирует нули слева от найденного нуля; сортировка по столбцам позволяет не возвращаться вправо. Выполняется не более 2n перемещений, память O(1). Код рассчитан на числа 0 и 1 из примера; для строковых символов сравнивайте с '0'. Проверка всех значений и сортировки потребовала бы O(n²).

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее