Leetcode 54 Spiral Matrix
Given an m x n matrix, return all elements of the matrix in spiral order.
Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,2,3,6,9,8,7,4,5]
Input: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
- Soruda bize bir matrix veriliyor.Verilen bu matrix içinde spiral şeklinde dolaşmamız isteniyor.
- Örnekte görüldüğü gibi bir spiral çizecek şekilde değerleri dönmemiz bekleniyor.
- Nerede durup, nerede devam edeceğimizi bilmemiz için 4 değer atarız.
- Sol =0, Sag=sıranın uzunluğu, Tepe=0, Taban=Sütunun uzunluğu.
- Amacımız sol sağdan küçük ve tepede tabandan küçük olduğu sürece matrix içinde dolaşmak ve her seferinde matrixi köşelerden küçültmek.
- İlk olarak sol tepeden başlar.Soldan sağa tüm değerleri alırız.İlk sıradaki tüm değerleri aldığımız için artık sonraki sıraya geçebiliriz -> Tepe + 1
- Şimdi en sağdaki sütunu tabana kadar olan değerleri alırız.Orada işimiz bittiğinde -> Sag - 1
- Burada değerler alındıktan sonra tepe ve sag güncellendiği için sagın soldan ve tabanın tepeden büyük olduğunu kontrol edelim.
- Tabandaki sıranın sondan başa değerlerini alırız. -> Taban -1
- İlk sütunun tabanındayız.Burada tabandan tepeye değerleri alırız -> sol +1
- Taban tepeye eşit yada sol sağa eşit olduğunda döngüyü bitirir sonuç listesini döneriz.
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res = []
left,right = 0,len(matrix[0])
top, bottom = 0,len(matrix)
while left < right and top < bottom:
for i in range (left,right):
res.append(matrix[top][i])
top += 1
for i in range(top,bottom):
res.append(matrix[i][right-1])
right -= 1
if not (left < right and top < bottom):
break
for i in range(right - 1, left -1, -1):
res.append(matrix[bottom - 1][i])
bottom -=1
for i in range (bottom-1,top-1,-1):
res.append(matrix[i][left])
left +=1
return res