Contents

[Golang][Leetcode][Array]刷題系列-59-Spiral Matrix


59. Spiral Matrix II


Level : Medium

原題連結 : Click

題目 :

Given a positive integer n, generate an n x n matrix filled with elements from 1 to n2 in spiral order.


Example :

Note

Input: n = 3

Output: [[1,2,3],[8,9,4],[7,6,5]]


以下是我自己的解法 - O(n^2)

Runtime: 0 ms, faster than 100.00% of Go online submissions for Spiral Matrix II.

解題思路 :

  • 首先題目要求螺旋式的從外面向裡面填入數字到n*n矩陣從1開始直到填滿,所以會填到n*n個數字進去
  • 這個題目沒有特別的解法就是純粹需要設定好 “邊界條件” & “堅持循環不變量原則(與binary search相同)”
  • 所以需要模擬順時針填入矩陣的過程

解法 :

  • 首先我們可以先規劃出過程
    1. 從左到右
    2. 從上到下
    3. 從右到左
    4. 從下到上
  • 然後我設定每次要走到底才算完成,像是 i = left -> right if left <= right
  • <= 是重點,也就是我們所謂的"堅持循環不變量原則"要定義的原則
  • 再來想像每次走完一行或一列就很像築起了一道牆,同個方向的路程會 +-1
  • 所以我們要設定4個邊界條件,也根據它們的初始位置跟矩陣的對應對他們賦值
    1. left = 0
    2. right = n - 1
    3. top = 0
    4. bottom = n - 1
  • 先考慮在執行 1. 的情況,從j = left走到right,然後每個循環都將 matrix[top][j] = val
  • 因為已經成功築起了一道牆,所以top++
  • 先考慮在執行 2. 的情況,從i = top走到bottom,然後每個循環都將 matrix[i][right] = val
  • 因為已經成功築起了一道牆,所以right–
  • 先考慮在執行 3. 的情況,從j = right走到left,然後每個循環都將 matrix[bottom][j] = val
  • 因為已經成功築起了一道牆,所以bottom–
  • 先考慮在執行 4. 的情況,從i = bottom走到top,然後每個循環都將 matrix[i][left] = val
  • 因為已經成功築起了一道牆,所以left++

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
func generateMatrix(n int) [][]int {
    
    matirx := make([][]int,n)

    for i := 0; i < n; i++ {
        matirx[i] = make([]int,n)
    }
    
    target := n*n
    
    val := 0
    
    left, right, top, bottom := 0, n-1, 0, n-1
    
    
    for val < target {
        
        for j := left; j <= right; j++ {
            
            val++

            matirx[top][j] = val
            
        }
        
        top++

        
        for i := top; i <= bottom; i++ {
            
            val++
            
            matirx[i][right] = val
            
        }
        
        right--

        for j := right; j >= left; j-- {
            
            val++
            
            matirx[bottom][j] = val
            
        }
        
        bottom-- 
        
        for i := bottom; i >= top; i-- {
            
            val++
            
            matirx[i][left] = val
        
        }        
        
        left++
               
    }
    
    return matirx
    
}

最後祝福努力認真的各位 “All your dream of are hidden in your daily life” 我們峰頂見!!!