n x n bir matrisi ek bellek kullanmadan (in-place) 90 derece saat yönünde döndürün.

Cevap

Saat yönünde 90 derece döndürme = transpose (köşegene göre yansıtma) + her satırı ters çevirme. İki adım da yerinde yapılabilir.

def rotate(matrix):
    n = len(matrix)
    # 1) Transpose: matrix[i][j] <-> matrix[j][i]
    for i in range(n):
        for j in range(i + 1, n):
            matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
    # 2) Her satırı ters çevir
    for row in matrix:
        row.reverse()

m = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]
rotate(m)
print(m)  # [[7, 4, 1], [8, 5, 2], [9, 6, 3]]

Neden doğru?

Saat yönünde döndürmede (i, j) konumundaki eleman (j, n-1-i) konumuna gider. Transpose (i, j) -> (j, i) yapar, satırı ters çevirmek sütunu i -> n-1-i yapar; ikisi birleşince formül elde edilir.

Varyasyonlar

İşlemYöntem
90 derece saat yönütranspose + satırları ters çevir
90 derece saat yönü tersitranspose + sütunları ters çevir (veya satır sırasını ters çevir)
180 derecesatır sırasını ve her satırı ters çevir

Karmaşıklık

O(n²) zaman, O(1) ek bellek.

Alternatif olarak katman katman (dıştan içe) dört elemanı döngüsel olarak yer değiştirme yöntemi de vardır; daha az okunaklıdır ama tek geçiştir.

  1. Binary search'ün zaman karmaşıklığı nedir ve neden?KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  2. Two Sum: toplamı hedefe eşit olan iki elemanın indekslerini bulun.KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  3. Bir parantez dizisinin geçerli olup olmadığını kontrol edin: "({[]})"KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  4. Tek yönlü bağlı listeyi ters çevirin.OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  5. BFS ve DFS arasındaki fark nedir? Hangisini ne zaman kullanırsınız?OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  6. get ve put işlemleri O(1) olan bir LRU Cache tasarlayın.ZorAlgoritmalar & Veri YapılarıYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle