1、描述
给定一个正整数n,生成一个包含1到n^2所有元素,且元素按顺时针螺旋排列的正方形矩阵
例:输入:3
输出:[
[1, 2, 3],
[8, 9, 4],
[7, 6, 5]
]
2、算法
解法一:暴力法O(n^2)
思路:一圈一圈打印 从外向里,每一行或每一列打印时候 注意留下一个
func generateMatrix2(_ n: Int) -> [[Int]] {
//构建矩阵
var matrix : [[Int]] = [[Int]].init(repeating: [Int].init(repeating: 0, count: n), count: n)
//每一圈左边的起始位置和右边的结束位置,由于是正方形座椅列相同
var left = 0, right = n-1
//填充的数字
var insertNum = 1
while left <= right {
//最中间的一个
if left == right {
matrix[left][right] = insertNum
insertNum += 1
}
//最上面一行,除去最后一个
for i in left..<right {
matrix[left][i] = insertNum
insertNum += 1
}
//最右边一列,除去最后一个
for i in left..<right{
matrix[i][right] = insertNum
insertNum += 1
}
//最下面一行,除去最后一个(逆序)
var i = right
while i > left{
matrix[right][i] = insertNum
insertNum += 1
i -= 1
}
//最左边一行,除去最后一个(逆序)
i = right
while i > left {
matrix[i][left] = insertNum
insertNum += 1
i -= 1
}
left += 1
right -= 1
}
return matrix
}
解法二:判断边界条件
思路:以上下左右四个方向的边界条件来做判断,构建矩阵
func generateMatrix(_ n: Int) -> [[Int]] {
//构建矩阵
var matrix : [[Int]] = [[Int]].init(repeating: [Int].init(repeating: 0, count: n), count: n)
var insertNum = 1
var i = 0
while i<(n+1)/2 {
var j = i
while j < n-i {
//四周终止位置
let l = i, u=i, r=n-1-i, d=n-1-i
//上
var k = i
while k <= r{
matrix[u][k] = insertNum
insertNum += 1
k += 1
}
//右
k = i+1
while k <= d{
matrix[k][r] = insertNum
insertNum += 1
k += 1
}
//下
k = r-1
while k >= l{
matrix[d][k] = insertNum
insertNum += 1
k -= 1
}
//左
k = d-1
while k > u{
matrix[k][l] = insertNum
insertNum += 1
k -= 1
}
i += 1
}
i += 1
}
return matrix
}
解法三:模拟过程
思路:整体采用构建矩阵,填充矩阵的思路
填充过程分为四种情况:
从左到右填充一行
从上到下填充一列
从右到左填充一行,注意只有一行的情况
从下到上填充一列,注意只有一列的情况
时间复杂度:O(n^2)
func generateMatrix(_ n: Int) -> [[Int]] {
//构建矩阵
var matrix : [[Int]] = [[Int]].init(repeating: [Int].init(repeating: 0, count: n), count: n)
//计算结果值
var resultNum = n*n
//填充矩阵
var rowBegin = 0
var rowEnd = n-1
var columnBegin = 0
var columnEnd = n-1
var insertNum = 1
while insertNum <= resultNum {
//填充矩阵的上边,从左到右填充一行
//每次h循环行不变,列+1,并且循环结束后行+1
var columnTemp = columnBegin
while columnTemp <= columnEnd {
matrix[rowBegin][columnTemp] = insertNum
insertNum += 1
columnTemp += 1
}
rowBegin += 1
//填充矩阵的右边,从上到下填充一列
//每次循环列不变,行+1,并且循环结束后列-1
var rowTemp = rowBegin
while rowTemp <= rowEnd{
matrix[rowTemp][columnEnd] = insertNum
insertNum += 1
rowTemp += 1
}
columnEnd -= 1
//填充矩阵的下边,从右到左填充一行(注意只有一行的情况)
//每次循环不变,列-1,并且循环结束后行+1
columnTemp = columnEnd
while columnTemp >= columnBegin && rowEnd >= rowBegin{
matrix[rowEnd][columnTemp] = insertNum
insertNum += 1
columnTemp -= 1
}
rowEnd -= 1
//填充矩阵的左边,从下到上填充一列(注意只有一列的情况)
//每次循环不变,行+1,并且循环结束后列+1
rowTemp = rowEnd
while rowTemp >= rowBegin && columnEnd >= columnBegin {
matrix[rowTemp][columnBegin] = insertNum
insertNum += 1
rowTemp -= 1
}
columnBegin += 1
}
return matrix
}