swift算法:螺旋矩阵II

1、描述

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

例:输入:3

        输出:[

                      [1, 2, 3],

                      [8, 9, 4],

                      [7, 6, 5]

                     ]

2、算法

解法一:暴力法O(n^2)

思路:一圈一圈打印 从外向里,每一行或每一列打印时候 注意留下一个

func generateMatrix2(_ n: Int) -> [[Int]] {
        
        //构建矩阵
        var matrix : [[Int]] = [[Int]].init(repeating: [Int].init(repeating: 0, count: n), count: n)
        //每一圈左边的起始位置和右边的结束位置,由于是正方形座椅列相同
        var left = 0, right = n-1
        //填充的数字
        var insertNum = 1
        
        while left <= right {
            //最中间的一个
            if left == right {
                matrix[left][right] = insertNum
                insertNum += 1
            }
            //最上面一行,除去最后一个
            for i in left..<right {
                matrix[left][i] = insertNum
                insertNum += 1
            }
            //最右边一列,除去最后一个
            for i in left..<right{
                matrix[i][right] = insertNum
                insertNum += 1
            }
            //最下面一行,除去最后一个(逆序)
            var i = right
            while i > left{
                matrix[right][i] = insertNum
                insertNum += 1
                i -= 1
            }
            //最左边一行,除去最后一个(逆序)
            i = right
            while i > left {
                matrix[i][left] = insertNum
                 insertNum += 1
                 i -= 1
            }
            
            left += 1
            right -= 1
        }
        
        return matrix
    }

解法二:判断边界条件

思路:以上下左右四个方向的边界条件来做判断,构建矩阵

func generateMatrix(_ n: Int) -> [[Int]] {
        //构建矩阵
        var matrix : [[Int]] = [[Int]].init(repeating: [Int].init(repeating: 0, count: n), count: n)
        var insertNum = 1
        var i = 0
        while i<(n+1)/2 {
            var j = i
            while j < n-i {
                //四周终止位置
                let l = i, u=i, r=n-1-i, d=n-1-i
                //上
                var k = i
                while k <= r{
                    matrix[u][k] = insertNum
                    insertNum += 1
                    k += 1
                }
                //右
                k = i+1
                while k <= d{
                    matrix[k][r] = insertNum
                    insertNum += 1
                    k += 1
                }
                
                //下
                k = r-1
                while k >= l{
                    matrix[d][k] = insertNum
                    insertNum += 1
                    k -= 1
                }
                
                //左
                k = d-1
                while k > u{
                    matrix[k][l] = insertNum
                    insertNum += 1
                    k -= 1
                }
                
                
                i += 1
            }
            i += 1
        }
        
        return matrix
    }

解法三:模拟过程

思路:整体采用构建矩阵,填充矩阵的思路

填充过程分为四种情况:         

         从左到右填充一行

         从上到下填充一列

         从右到左填充一行,注意只有一行的情况

         从下到上填充一列,注意只有一列的情况

时间复杂度:O(n^2)

func generateMatrix(_ n: Int) -> [[Int]] {
        
        //构建矩阵
        var matrix : [[Int]] = [[Int]].init(repeating: [Int].init(repeating: 0, count: n), count: n)
        //计算结果值
        var resultNum = n*n
        //填充矩阵
        var rowBegin = 0
        var rowEnd = n-1
        var columnBegin = 0
        var columnEnd = n-1
        var insertNum = 1
        while insertNum <= resultNum {
            //填充矩阵的上边,从左到右填充一行
            //每次h循环行不变,列+1,并且循环结束后行+1
            var columnTemp = columnBegin
            while columnTemp <= columnEnd {
                matrix[rowBegin][columnTemp] = insertNum
                insertNum += 1
                columnTemp += 1
            }
            rowBegin += 1
            
            //填充矩阵的右边,从上到下填充一列
            //每次循环列不变,行+1,并且循环结束后列-1
            var rowTemp = rowBegin
            while rowTemp <= rowEnd{
                matrix[rowTemp][columnEnd] = insertNum
                insertNum += 1
                rowTemp += 1
            }
            columnEnd -= 1
            
            //填充矩阵的下边,从右到左填充一行(注意只有一行的情况)
            //每次循环不变,列-1,并且循环结束后行+1
            columnTemp = columnEnd
            while columnTemp >= columnBegin && rowEnd >= rowBegin{
                matrix[rowEnd][columnTemp] = insertNum
                insertNum += 1
                columnTemp -= 1
            }
            rowEnd -= 1
            
            //填充矩阵的左边,从下到上填充一列(注意只有一列的情况)
            //每次循环不变,行+1,并且循环结束后列+1
            rowTemp = rowEnd
            while rowTemp >= rowBegin && columnEnd >= columnBegin {
                matrix[rowTemp][columnBegin] = insertNum
                insertNum += 1
                rowTemp -= 1
            }
            columnBegin += 1
            
        }
        
        return matrix
    }

猜你喜欢

转载自blog.csdn.net/lin1109221208/article/details/93485579