美文网首页
IOS 算法(中级篇) ----- 螺旋矩阵II

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

作者: ShawnAlex | 来源:发表于2021-03-16 15:20 被阅读0次

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

例子:

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

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

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

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

  • 算法:螺旋矩阵 II

    问题 给你一个数n生成一个包含1到n^2的螺旋形矩阵 样例 矩阵为 思路 将矩阵转化成一个x轴向右,y轴向下的x0...

  • LeetCode 59 螺旋矩阵II

    LeetCode 59 螺旋矩阵II 题目描述: 代码:

  • LeetCode刷题-螺旋矩阵II

    前言说明 算法学习,日常刷题记录。 题目连接 螺旋矩阵II[https://leetcode-cn.com/pro...

  • 螺旋矩阵 II

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

  • 螺旋矩阵II

    题目信息 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正...

  • IOS 算法合集

    这里用来总结记录所有算法(大部分Swift) 中级篇IOS 算法(中级篇) ----- 三数之和求解问题[http...

  • Leetcode 螺旋矩阵 II

    题目描述 leecode第59题:螺旋矩阵 II[https://leetcode-cn.com/problems...

  • 59.螺旋矩阵II

网友评论

      本文标题:IOS 算法(中级篇) ----- 螺旋矩阵II

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