算法练习--LeetCode--54. Spiral Matrix 100%
- Spiral Matrix
MediumGiven 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]
简单说就是二维数组顺时针🔃读取成一位数组,拆开看问题,其实每次去掉最外面一层剩下的还是一个二维数组,从这里出发可以使用递归,但是这里使用循环就够了,加四个标志位:上下左右,Swift(100%)代码如下:
// swift code class Solution { func spiralOrder(_ matrix: [[Int]]) -> [Int] { // 特殊 case 直接返回 if matrix.count < 2 { return matrix.first ?? [] } // 标记左右上下 var l = 0, r = matrix.first!.count - 1, t = 0, b = matrix.count - 1 var result = [Int]() // 数组片段转置且类型转为数组 let reverse_: (ArraySlice<Int>) -> [Int] = { (slice) in var temp = slice temp.reverse() return Array(temp) } while true { // 每一组的第一行是可以直接追加到结果中的 result += Array(matrix[t][l...r]) if t + 1 < b { // 自上至下取出每一个数组的最后一个有效元素加入到结果 for i in (t + 1)..<b { result.append(matrix[i][r]) } result += reverse_(matrix[b][l...r]) if l != r { var temp = b - 1 // 自下至上取出每一个数组的第一个有效元素加入到结果 while temp > t { result.append(matrix[temp][l]) temp -= 1 } r -= 1 l += 1 t += 1 b -= 1 if l > r { break } } else { break } } else if t != b { // 最后一行的转置数组加到结果中 result += reverse_(matrix[b][l...r]) break } else { break } } return result } }
TestCase
// swift code assert(Solution().spiralOrder([[1]]) == [1]) assert(Solution().spiralOrder([[1], [2]]) == [1, 2]) assert(Solution().spiralOrder([[1], [2], [3]]) == [1, 2, 3]) assert(Solution().spiralOrder([[1, 2], [4, 5]]) == [1, 2, 5, 4]) assert(Solution().spiralOrder([[2, 5], [8, 4], [0 ,-1]]) == [2, 5, 4, -1, 0, 8]) assert(Solution().spiralOrder([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) == [1, 2, 3, 6, 9, 8, 7, 4, 5]) assert(Solution().spiralOrder([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) == [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7])