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
| İşlem | Yöntem |
|---|---|
| 90 derece saat yönü | transpose + satırları ters çevir |
| 90 derece saat yönü tersi | transpose + sütunları ters çevir (veya satır sırasını ters çevir) |
| 180 derece | satı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.
İlgili Algoritmalar & Veri Yapıları soruları
- Binary search'ün zaman karmaşıklığı nedir ve neden?
- Two Sum: toplamı hedefe eşit olan iki elemanın indekslerini bulun.
- Bir parantez dizisinin geçerli olup olmadığını kontrol edin: "({[]})"
- Tek yönlü bağlı listeyi ters çevirin.
- BFS ve DFS arasındaki fark nedir? Hangisini ne zaman kullanırsınız?
- get ve put işlemleri O(1) olan bir LRU Cache tasarlayın.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.