给你一个正整数 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 算法合集地址
网友评论