Рубрики
Без рубрики

[Google интервью] вращается матрица

🏗️ спросил в: Google, Facebook, Amazon вы испугаете, что вы задаете этот вопрос в интервью? Не волнуйся! Ты не одинок. Многие люди нашли его пугающими. К сожалению, вероятность увидеть его хотя бы один раз довольно высокой, если вы претерпели много интервью. Многие собеседники утверждали, что они … [собеседование Google] вращают матрицу Подробнее »

Автор оригинала: Shubham Sayon.

🏗️ спросил в : Google , Facebook , Амазонка

Вы испугаетесь в том, что это задают этот вопрос в интервью? Не волнуйся! Ты не одинок. Многие люди нашли его пугающими. К сожалению, вероятность увидеть его хотя бы один раз довольно высокой, если вы претерпели много интервью. Многие собеседники утверждали, что увидели это несколько раз! Следовательно, это один из этих немногих вопросов, которые требуют много практикующих, чтобы убедиться, что вы можете уверенно кодировать его и объяснить это, не думая о слишком большом количестве.

Постановка проблемы

Вам дают N X N 2D Matrix представляющий изображение. Поверните изображение по 90 градусов (по часовой стрелке ). Вы должны сделать это на месте Отказ

⚠️ Ограничения:

  • Matrix.length
  • Матрица [I]. Длина
  • 1
  • -1000 [I] [J]

💣 Задача: Старайтесь не выделять еще одну 2D матрицу и сделать вращение.

💡examples.

Давайте посмотрим на некоторые примеры для улучшения нашего понимания этой проблемы.

✏️ Example 1

Input: matrix = [[1,2],[3,4]] 
Output: [[3,1],[4,2]]
Explanation:


✏️ Example 2 
Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [[7,4,1],[8,5,2],[9,6,3]]
Explanation:


✏️ Example 3
Input: matrix = [[1]]
Output: [[1]] 
Explanation: This is an edge case.

Теперь давайте погрузимся в решения данной проблемы.

🖊️solution 1: более легкий подход

Подход

Подход может быть лучше всего понять с помощью примера. Следовательно, давайте рассмотрим следующую матрицу, чтобы понять демонстрацию.

Теперь, если вы внимательно заметите, вы обнаружите, что если вы поменяете Колонка «Я» Тогда это будет соответствовать новым ряд в «Я» в результате матрицы. Например:

  • столбец 0 В оригинальной матрице в обратном порядке 7 4 1 что соответствует ряд 0 в результате матрицы.
  • Столбец 1 В оригинальной матрице в обратном порядке 8 5 2 что соответствует ряд 1 в результате матрицы.
  • Колонка 2 В оригинальной матрице в обратном порядке 9 6 3 что соответствует ряд 2 в результате матрицы.

Вы можете просто реализовать этот подход и продолжать хранить результат в другом 2-м массиве. Теперь давайте визуализируемся, где элементы должны быть в конечном итоге в результирующем массиве в каждой итерации.

Теперь пришло время погрузиться в код:

def rotate_matrix(matrix):
    n = len(matrix)
    k = [[0 for i in range(n)] for j in range(n)]

    for i in range(n):
        for j in range(n):
            k[j][n - i - 1] = matrix[i][j]
    return k

Давайте выполним тестовые случаи в коде.

Вход Выход
[[1, 2], [3, 4]] [[3, 1], [4, 2]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] [[7, 4, 1], [8, 5, 2], [9, 6, 3]]
[[1]] [[1]]

Анализ сложности: Сложность времени выполнения такого подхода – O (m) где М обозначает количество ячеек в данной матрице.

Обсуждение: Этот подход довольно прост. Однако он не полностью удовлетворяет цели этого вопроса. Было упомянуто, что мы должны повернуть матрицу «На месте» (Не допускается дополнительное пространство.) И мы не удовлетворяли этому условию, когда мы сохранили выходные данные в другой матрице. Этот подход потребляет дополнительное пространство O (n 2 ) где n рядов в 2D массива Отказ Следовательно, есть ли способ избежать хранения вывода в другой матрице для достижения решения?

🖊️solution 2: в месте вращения

Подход: Чтобы обеспечить вращение матрицы без потребления дополнительного пространства, вы должны одновременно перемещать 4 элемента в матрице в группах по четырем. Чтобы визуализировать этот подход, давайте еще раз рассмотрим вышеуказанную матрицу.

Здесь следующая операция должна произойти в первой итерации:

  • 7 необходимо в конечном итоге в положении 1.
  • Если 7 выходит на 1 ‘в позиции, то нам нужно проверить, где 1 нужно идти, иначе, если значение 1 будет потеряно. Таким образом, 1 необходимо перейти к 3 возможности.
  • 3 необходимо перейти на 9 возможностей.
  • 9 должен идти в положение 7.
  • Мы уже разместили 7 в 1 позицию.

Аналогичные корректировки должны быть сделаны в каждой итерации для поддержания постоянного использования памяти. Вопрос в том, как мы достигаем этого подвига? Вы можете сделать это в два шага –

Шаг 1: транспонировать матрицу.

🗒️ Транспонировать матрицу Получается путем преобразования колонн к строкам и рядам к столбцам. Таким образом, транспонировать матрицы [ROW] [колонна] получается путем преобразования [ROW] [колонна] к [Колонна] [строка] Отказ

Код для транспонирования матрицы:

for row in range(len(matrix)):
    for col in range(row, len(matrix)):
        matrix[row][col], matrix[col][row] = matrix[col][row], matrix[row][col]

Шаг 2: Обратитесь за ряды транспонированных матрицы.

Как только вы транслировали матрицу, вам просто нужно поменять строки матрицы транспозью, чтобы вывести матрицу вывода. Следующий код делает именно это.

n = len(matrix)
for i in range(n // 2):
    for j in range(n):
        matrix[j][i], matrix[j][n - 1 - i] = matrix[j][n - 1 - i], matrix[j][i]

Давайте визуализируем то, что происходит с матрицей в каждой итерации.

Теперь все, что осталось сделать, – в клуб два шага вместе. Следовательно, давайте посмотрим на полное решение.

def rotate_matrix(matrix):
    # transpose the matrix
    for row in range(len(matrix)):
        for col in range(row, len(matrix)):
            matrix[row][col], matrix[col][row] = matrix[col][row], matrix[row][col]
    n = len(matrix)
    # swap columns moving inwards from outwards
    for i in range(n // 2):
        for j in range(n):
            matrix[j][i], matrix[j][n - 1 - i] = matrix[j][n - 1 - i], matrix[j][i]
    return matrix

Время выполнить тестовые случаи в нашем коде и проверять его эффективность.

Example 1
matrix = [[1, 2], [3, 4]]
print(rotate_matrix(matrix))
# [[3, 1], [4, 2]]

Example 2
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(rotate_matrix(matrix))
# [[7, 4, 1], [8, 5, 2], [9, 6, 3]]

Example 3
matrix = [[1]]
print(rotate_matrix(matrix))
# [[1]]

Это именно то, что мы ожидали, и наш подход передал все испытательные случаи.

Анализ сложности

Пусть m – количество клеток в данной матрице.

  • Сложность времени
    • Транспонирование Матрица имеет сложность выполнения O (m) Как мы перемещая ценность каждой ячейки один раз.
    • Реверс Каждая строка также имеет сложность выполнения O (m) Потому что еще раз мы перемещаем значение каждой ячейки один раз.
    • Следовательно, Общая сложность времени нашего кодекса – O (м)
  • Космическая сложность : Поскольку мы не используем никаких других дополнительных структур данных, пространство сложности в этом случае – O (1) Отказ

Заключение

Я надеюсь, что вам понравилось этот опрос кодирования. Пожалуйста, оставайся настроенными и Подписаться Для более интересных проблем кодирования.

Рекомендуется: Академия компьютерной науки Finxter

  • Вы хотите быстро освоить самые популярные Python IDE?
  • Этот курс приведет вас от новичка к эксперту в Пычарме в ~ 90 минут.
  • Для любого разработчика программного обеспечения имеет решающее значение для освоения IDE хорошо, писать, тестировать и отлаживать высококачественный код с небольшим усилием.

Присоединяйтесь к Pycharm MasterClass Сейчас и мастер Pycharm на завтра!

Я профессиональный Python Blogger и Content Creator. Я опубликовал многочисленные статьи и создал курсы в течение определенного периода времени. В настоящее время я работаю полный рабочий день, и у меня есть опыт в областях, таких как Python, AWS, DevOps и Networking.

Вы можете связаться со мной @: