首页 > 技术文章 > [Swift]LeetCode54. 螺旋矩阵 | Spiral Matrix

strengthen 2018-11-06 20:22 原文

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9917757.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

Example 1:

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

Example 2:

Input:
[
  [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]

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例 2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

8ms
 1 class Solution {
 2     func spiralOrder(_ matrix: [[Int]]) -> [Int] {
 3         var res = [Int]()
 4         if (matrix.count == 0) {
 5             return res
 6         }
 7         var startX = 0
 8         var endX = matrix.count - 1
 9         var startY = 0
10         var endY = matrix[0].count - 1
11         
12         while(true) {
13             for i in startY...endY {
14                 res.append(matrix[startX][i])
15             }
16             startX += 1
17             if (startX > endX) {
18                 break
19             }
20             
21             for i in startX...endX {
22                 res.append(matrix[i][endY])
23             }
24             endY -= 1
25             if (endY < startY) {
26                 break
27             }
28 
29 
30             for i in stride(from: endY, through:startY, by:-1) {
31                 res.append(matrix[endX][i])
32             }
33             endX -= 1
34             if (endX < startX) {
35                 break
36             }
37             for i in stride(from:endX, through:startX, by:-1) {
38                 res.append(matrix[i][startY])
39             }
40             startY += 1
41             if (startY > endY) {
42                 break
43             }
44         }
45         return res
46     }
47 }

8ms

 1 class Solution {
 2     func spiralOrder(_ matrix: [[Int]]) -> [Int] {
 3         guard !matrix.isEmpty else {
 4             return []
 5         }
 6         
 7         var column = 0
 8         var row = 0
 9 
10         let loopCount = (min(matrix.count, matrix[0].count) + 1) / 2
11 
12         var numbers: [Int] = []
13 
14         for loopIndex in 0..<loopCount {
15 
16             let lastColumn = matrix[0].count - loopIndex - 1
17             let lastRow = matrix.count - loopIndex - 1
18 
19             if loopIndex == lastRow {
20                 for index in loopIndex...lastColumn {
21                     numbers.append(matrix[loopIndex][index])
22                 }
23             } else if loopIndex == lastColumn {
24                 for index in loopIndex...lastRow {
25                     numbers.append(matrix[index][loopIndex])
26                 }
27             } else {
28                 for index in loopIndex..<lastColumn {
29                     numbers.append(matrix[loopIndex][index])
30                 }
31 
32                 for index in loopIndex..<lastRow {
33                     numbers.append(matrix[index][lastColumn])
34                 }
35 
36                 var index = lastColumn
37                 while index > loopIndex {
38                     numbers.append(matrix[lastRow][index])
39                     index -= 1
40                 }
41 
42                 index = lastRow
43                 while index > loopIndex {
44                     numbers.append(matrix[index][loopIndex])
45                     index -= 1
46                 }
47             }
48         }
49 
50         return numbers
51     }
52 }

 12ms

 1 class Solution {
 2     func spiralOrder(_ matrix: [[Int]]) -> [Int] {
 3          if(matrix == nil || matrix.count == 0) {
 4             return [];
 5         }
 6         var rows = matrix.count;
 7         var cols = matrix[0].count;
 8         var col = 0
 9         var row = 0
10         print(cols)
11         var outputArray = [Int]()
12         while(row < rows && col < cols) {
13             for i in col...cols-1{
14                 print("inside1")
15                 print(row,i)
16                 outputArray.append(matrix[row][i])
17             }
18             row += 1
19             if(row <= rows-1) {
20             for i in row...rows-1{
21                print("inside2")
22                print(i,cols-1)
23                outputArray.append(matrix[i][cols-1])
24             }
25             }
26             cols -= 1
27             //print left
28             if(row <= rows-1 && col <= cols-1) {
29                 for i in (col...cols-1).reversed() {
30                     print("inside3")
31                     print(rows-1,i)
32                     outputArray.append(matrix[(rows-1)][i])
33                 }
34                 rows -= 1
35             }
36             //print up
37             if(col <= cols-1 && row <= rows-1) {
38             for i in (row...rows-1).reversed() {
39                 print("inside4")
40                 print(i,col)
41                 outputArray.append(matrix[i][col])
42             }
43             col += 1
44             }
45         }
46         return outputArray
47     }
48 }

12ms

 1 class Solution {
 2     func spiralOrder(_ matrix: [[Int]]) -> [Int] {
 3         
 4         if matrix.count < 1 {
 5             return []
 6         }
 7         
 8         let m = matrix.count
 9         let n = matrix[0].count
10         
11         var result: [Int] = []
12         
13         var a: Int = 0
14         var b: Int = 0
15         
16         var direct: Int = 0 // 0表示向右,1表示向下,2表示向左,3表示向右
17         
18         // 定义边界
19         var top: Int = -1
20         var left: Int = -1
21         var right: Int = n
22         var bottom: Int = m
23         
24         for index in 1...m*n {
25          
26             if index == 1 {
27                 result.append(matrix[b][a])
28                 continue
29             }
30             if direct == 0{
31                 if a+1 >= right && b+1 < bottom {
32                     b += 1
33                     top += 1
34                     direct = 1
35                 }else if a+1 >= right && b+1 >= bottom{
36                     break
37                 }else{
38                     a += 1
39                 }
40                 result.append(matrix[b][a])
41                 continue
42                 
43             }else if direct == 1{
44                 if b+1 >= bottom && a-1 > left{
45                     // 下边即将越界,转移方向向左便利
46                     a -= 1
47                     right -= 1 // 一行遍历完了
48                     direct = 2
49                 }else if b+1 >= bottom && a-1 <= left{
50                     break
51                 }else{
52                     b += 1
53                 }
54                 result.append(matrix[b][a])
55                 continue
56             }else if direct == 2{
57                 if a-1 <= left && b-1 > top{
58                     // 右边即将越界,转移方向向下便利
59                     b -= 1
60                     bottom -= 1 // 一行遍历完了
61                     direct = 3
62                 }else if a-1 <= left && b-1 <= top{
63                     break
64                 }else{
65                     a -= 1
66                 }
67                 result.append(matrix[b][a])
68                 continue
69             }else if direct == 3{
70                 if b-1 <= top && a+1 < right{
71                     // 右边即将越界,转移方向向下便利
72                     a += 1
73                     left += 1 // 一行遍历完了
74                     direct = 0
75                 }else if b-1 <= top && a+1 >= right{
76                     break
77                 }else{
78                     b -= 1
79                 }
80                 result.append(matrix[b][a])
81                 continue
82             }
83         }
84         
85         return result
86     }
87 }

20ms

 1 class Solution {
 2     func spiralOrder(_ matrix: [[Int]]) -> [Int] {
 3         
 4         
 5         var result: [Int] = []
 6         if let firstCol = matrix.first {
 7             var x = 0
 8             var y = 0
 9             var row = matrix.count - 1
10             var col = firstCol.count - 1
11             while x <= row && y <= col {
12                 
13                 if x <= col {
14                     for i in x ... col {
15                         result.append(matrix[y][i])
16                     }
17                 }
18                 
19                 if y + 1 <= row {
20                     for j in y + 1 ... row {
21                         result.append(matrix[j][col])
22                     }
23                 }
24  
25                 if x <= col - 1 && y != row {
26                     for i in (x ... col - 1).reversed() {
27                         result.append(matrix[row][i])
28                     }
29                 }
30                 
31                 if y < row - 1 && x != col {
32                     for j in (y + 1 ... row - 1).reversed() {
33                         result.append(matrix[j][x])
34                     }
35                 }
36                 
37                 x += 1
38                 y += 1
39                 row -= 1
40                 col -= 1
41                 
42             }
43         }
44         
45         return result
46     }
47 }

24ms

 1 class Solution {
 2     func spiralOrder(_ matrix: [[Int]]) -> [Int] {
 3         
 4         var res = [Int]()
 5         
 6         let row = matrix.count
 7         
 8         if row == 0 {
 9             
10             return res
11         }
12         
13         let col = matrix[0].count
14         
15         
16         if col == 0 {
17             
18             return res
19         }
20         
21         var top = 0, right = col - 1, bottom = row - 1, left = 0
22         
23         var direction = 0
24         
25         while top <= bottom && left <= right {
26             
27             if direction % 4 == 0 {
28                 
29                 for i in left ... right {
30                     
31                     res.append(matrix[top][i])
32                 }
33                 
34                 top += 1
35             }
36             
37             if direction % 4 == 1 {
38                 
39                 for i in top ... bottom {
40                     
41                     res.append(matrix[i][right])
42                 }
43                 
44                 right -= 1
45             }
46             
47             if direction % 4 == 2 {
48                 
49                 for i in stride(from: right, through: left, by: -1) {
50                     
51                     res.append(matrix[bottom][i])
52                 }
53                 
54                 bottom -= 1
55             }
56             
57             if direction % 4 == 3 {
58                 
59                 for i in stride(from: bottom, through: top, by: -1){
60                     
61                     res.append(matrix[i][left])
62                 }
63                 
64                 left += 1
65             }
66             
67             direction += 1
68         }
69         
70         return res
71     }
72 }

 

推荐阅读