算法练习--LeetCode--54. Spiral Matri

作者: Crazy凡 | 来源:发表于2019-01-12 19:41 被阅读1次
    1. Spiral Matrix
      Medium

    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]

    简单说就是二维数组顺时针🔃读取成一位数组,拆开看问题,其实每次去掉最外面一层剩下的还是一个二维数组,从这里出发可以使用递归,但是这里使用循环就够了,加四个标志位:上下左右,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])
    

    相关文章

      网友评论

        本文标题:算法练习--LeetCode--54. Spiral Matri

        本文链接:https://www.haomeiwen.com/subject/vswcdqtx.html