IOS 算法(中级篇) ----- 螺旋矩阵II

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

例子:

IOS 算法(中级篇) ----- 螺旋矩阵II_第1张图片
exp1

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

输入:n = 1
输出:[[1]]

解题思路:

建议先做一下 IOS 算法(中级篇) ----- 螺旋矩阵
模拟箭头方向, 顺时针执行, 遇到边界拐弯, 之前的边界缩1, 循环操作

例如:
定义初始空白数组 [[1,0,0],[0,0,0],[0,0,0]], 依次填充
i = 1, [[1,2,0],[0,0,0],[0,0,0]]
i = 2, [[1,2,3],[0,0,0],[0,0,0]], 因为到了左边界, 向下走, 最小上边界+1
i = 3, [[1,2,3],[0,0,4],[0,0,0]]
i = 4, [[1,2,3],[0,0,4],[0,0,5]], 因为到了下边界, 向左走, 最大右边界-1
i = 5, [[1,2,3],[0,0,4],[0,6,5]]
i = 6, [[1,2,3],[0,0,4],[7,6,5]], 因为到了左边界, 向上走, 最大下边界-1
i = 7, [[1,2,3],[8,0,4],[7,6,5]], 因为到了上边界, 向右走, 最小左边界+1
i = 8, [[1,2,3],[8,9,4],[7,6,5]], 因为到了上边界, 向右走, 最小左边界+1

因为改变元素一共只有8个 (2~9, 我这边1预先填写进去了, 也可不填写那么是8个)
超出结束循环返回结果

代码:

未翻译版
 func generateMatrix(_ n: Int) -> [[Int]] {

        var result = Array(repeating: Array(repeating: 0, count: n), count: n),
            arrow = "right", leftmin = 0, rightmax = n - 1, upmin = 0, downmax = n - 1,
            a = 0, b = 0, i = 1
        
        result[0][0] = 1
        
        while i < n * n {

            if arrow == "right" {
                b += 1
                if b == rightmax {
                    arrow = "down"
                    upmin += 1
                }
            }else if arrow == "down" {
                a += 1
                if a == downmax {
                    arrow = "left"
                    rightmax -= 1
                }  
            }else if arrow == "left" {
                b -= 1
                if b == leftmin {
                    arrow = "up"
                    downmax -= 1
                }
            }else if arrow == "up" {
                a -= 1
                if a == upmin {
                    arrow = "right"
                    leftmin += 1
                }
            }
            
            i += 1
            result[a][b] = i
        }
        
        return result
    }
翻译版
    func generateMatrix(_ n: Int) -> [[Int]] {

        /**
        result:   定义初始数组nxn, 元素全为0,
        arrow:    判断方向的标识
        leftmin:  左边界最小值, 初始0
        rightmax: 右边界最大值, 初始n - 1
        upmin:    上边界最小值, 初始0
        downmax:  下边界最大值, 初始n - 1
        a, b:     循环中的数组下标, 初始都为0
        i:        循环值, 初始1
        */
        var result = Array(repeating: Array(repeating: 0, count: n), count: n),
            arrow = "right", leftmin = 0, rightmax = n - 1, upmin = 0, downmax = n - 1,
            a = 0, b = 0, i = 1
        
        // 因为: 1 <= n <= 20, 必定有一个元素, 先填充1进去
        result[0][0] = 1
        
        // 循环i, i为n*n结束 
        while i < n * n {

            // 如果方向向右
            if arrow == "right" {

                // b = b + 1
                b += 1
                
                // 如果此时b为右边界值
                if b == rightmax {

                    // 箭头方向改为向下
                    arrow = "down"

                    // 上边界 +1
                    upmin += 1
                }

            // 如果方向向下
            }else if arrow == "down" {

                // a = a + 1
                a += 1

                // 如果a为下边界值
                if a == downmax {

                    // 箭头方向改为向左 
                    arrow = "left"

                    // 右边界 -1
                    rightmax -= 1
                }  

            // 如果方向向右
            }else if arrow == "left" {

                // b = b - 1
                b -= 1

                // 如果b为左边界值
                if b == leftmin {
       
                    // 箭头方向改为向上  
                    arrow = "up"
 
                    // 右边界 -1 
                    downmax -= 1
                }

            // 如果方向向上 
            }else if arrow == "up" {

                // a = a - 1
                a -= 1

                // 如果b为上边界值
                if a == upmin {

                    // 箭头方向改为右
                    arrow = "right"

                    // 左边界 +1 
                    leftmin += 1
                }
            }
            // i + 1 继续循环
            i += 1
            
            // 数组中对应a,b下标元素改为i
            result[a][b] = i
        }
        
        // 返回结果
        return result
    }

题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址

你可能感兴趣的:(IOS 算法(中级篇) ----- 螺旋矩阵II)