前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >模拟法螺旋遍历矩阵:54.螺旋矩阵(Kotlin)

模拟法螺旋遍历矩阵:54.螺旋矩阵(Kotlin)

作者头像
一个会写诗的程序员
发布2021-04-16 10:19:41
4960
发布2021-04-16 10:19:41
举报
文章被收录于专栏:一个会写诗的程序员的博客

54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

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

示例 2:

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

提示:

m == matrix.length n == matrix[i].length 1 <= m, n <= 10 -100 <= matrix[i][j] <= 100

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/spiral-matrix 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

模拟法。

模拟有一个遍历机器人,按照螺旋轨迹(4个方向:向右,向下,向左,向上)每一步一个格子移动(很显然,遍历完矩阵,要移动 m*n 次)。 已经遍历了的格子,我们标记一下,作为转弯的边界条件: visited[row][col] = true。 另外,在第一层遍历的时候,转弯的边界条件是不得超出矩阵的坐标范围,也就是: 0 < row < m 0 < col < n

关于方向向量: direction[4][2] 4个方向:向右,向下,向左,向上 (行下标,列下标) 向右,(0,+1) 向下,(+1,0) 向左,(0,-1) 向上,(-1,0)

代码

代码语言:javascript
复制
class Solution {
    fun spiralOrder(matrix: Array<IntArray>): List<Int> {
        val ans = mutableListOf<Int>()
        val rows = matrix.size
        if (rows == 0) {
            return emptyList()
        }
        val cols = matrix[0].size
        var row = 0
        var col = 0
        val total = rows * cols
        val direction = arrayOf(
            arrayOf(0, 1),  // right, row 不变,col + 1
            arrayOf(1, 0),  // down,  col 不变, row + 1
            arrayOf(0, -1), // left,  row 不变, col - 1
            arrayOf(-1, 0) // up,    col 不变, row - 1
        )

        // 是否已经访问过, 作为转弯的边界条件
        val visited: Array<BooleanArray> = Array(rows) {
            BooleanArray(cols) { false }
        }

        // direction 的下标, 取值为: 0, 1, 2, 3
        var directionIndex = 0

        // visit [ 0 ~ total-1 ] element
        for (i in 0 until total) {

            ans.add(matrix[row][col])
            visited[row][col] = true

            val nextRow = row + direction[directionIndex][0]
            val nextCol = col + direction[directionIndex][1]

            if (shouldTurnDirection(nextRow, nextCol, rows, cols, visited)) {
                directionIndex++
                directionIndex %= 4
            }

            // visit next element
            row += direction[directionIndex][0]
            col += direction[directionIndex][1]
        }

        return ans

    }

    fun shouldTurnDirection(nextRow: Int, nextCol: Int, rows: Int, cols: Int, visited: Array<BooleanArray>): Boolean {

        return nextRow >= rows // 超过最大行
            || nextCol >= cols // 超过最大列
            || nextRow < 0 // 0行
            || nextCol < 0 // 0列
            || visited[nextRow][nextCol] // 已经遍历过

    }

}

作者:chenguangjian2020 链接:https://leetcode-cn.com/problems/spiral-matrix/solution/luo-xuan-ju-zhen-mo-ni-fa-kotlin-by-chen-b5e8/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 54. 螺旋矩阵
  • 解题思路
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档