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

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。1 <= n <= 20
例子:
IOS|IOS 算法(中级篇) ----- 螺旋矩阵II
文章图片
exp1 【IOS|IOS 算法(中级篇) ----- 螺旋矩阵II】输入: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 = 1result[0][0] = 1while 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 算法合集地址

    推荐阅读