leetcode刷题笔记五十四及五十九 螺旋矩阵和螺旋矩阵II

leetcode刷题笔记五十四及五十九 螺旋矩阵和螺旋矩阵II


源地址:54. 螺旋矩阵

问题描述:

给定一个包含 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]

代码补充:

/**
使用按层处理矩阵的方法
以左上角即(0,0)处开始,沿 top -> right -> bottom -> left打印
外层打印完后,修改left、right、top、bottom值,进入内层打印
需要注意的是 要判断处理单层打印情况
进行 top -> right 一侧处理后, 需要判断是否之前打印的是否为单层,若为否,则继续打印,否则打印完成
时间复杂度:O(mn) 空间复杂度:O(1)
*/
import scala.collection.mutable
object Solution {
    def spiralOrder(matrix: Array[Array[Int]]): List[Int] = {
        if (matrix == null || matrix.length == 0 || matrix(0).length == 0) return List()
        
        val res = new mutable.ListBuffer[Int]()
        var left = 0
        var right = matrix(0).length - 1
        var top = 0
        var bottom = matrix.length - 1

        while( left <= right && top <= bottom ){
            for(col <- left to right) res += matrix(top)(col)
            for(row <- top+1 to bottom) res += matrix(row)(right)
            if(left < right && top < bottom){
                for(col <- (left+1 to right-1).reverse) res += matrix(bottom)(col)
                for(row <- (top+1 to bottom).reverse) res += matrix(row)(left)
            }
            left += 1
            right -= 1
            top += 1
            bottom -= 1
        }
        return res.toList
    }
}

源地址:59. 螺旋矩阵 II

问题描述:

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

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

代码补充:

/**
本题与54题思路遍历过程基本一致,使用left、right、top、bottom计算遍历位置,使用累加变量标记当前位置应放置的数据。注意这里仍然要进行单行判断。
*/
object Solution {
    def generateMatrix(n: Int): Array[Array[Int]] = {
        if (n == 0) return Array()
        val res =  Array.ofDim[Int](n, n)
        val fin = n*n
        var cur = 1
        var left = 0
        var right = n-1
        var top = 0
        var bottom = n-1

        while(left <= right && top <= bottom){
            
            for(i <- left to right){
                res(top)(i) = cur
                cur += 1
            }
            top += 1

            for(i <- top to bottom){
                res(i)(right) = cur
                cur += 1
            }
            right -= 1

            if(top < bottom && left < right){
                for(i <- (left to right).reverse){
                    res(bottom)(i) = cur
                    cur += 1
                }
                bottom -= 1

                for(i <- (top to bottom).reverse){
                    res(i)(left) = cur
                    cur += 1
                }
                left += 1
            }
        }
        return res
    }
}
posted @ 2020-07-10 16:08  ganshuoos  阅读(112)  评论(0编辑  收藏  举报