IOS|IOS 算法(中级篇) ----- 螺旋矩阵II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。1 <= n <= 20例子:
文章图片
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 算法合集地址
推荐阅读
- 2020-04-07vue中Axios的封装和API接口的管理
- 画解算法(1.|画解算法:1. 两数之和)
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- Guava|Guava RateLimiter与限流算法
- iOS中的Block
- 一个选择排序算法
- SG平滑轨迹算法的原理和实现
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- 《算法》-图[有向图]
- 2019-08-29|2019-08-29 iOS13适配那点事