Leetcode 54 Spiral Matrix

Given an m x n matrix, return all elements of the matrix in spiral order.

image
Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,2,3,6,9,8,7,4,5]
image
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