美文网首页
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

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