问题
给定一个整数n,生成一个由元素1到n^2按螺旋顺序填充的方阵。
例如,给定n = 3,
应返回以下矩阵:[ [ 1、2、3 ]、[ 8、9、4 ]、[ 7、6、5 ] ]
class Solution
{
func generateMatrix(n: Int) -> [[Int]]
{
var matrix =
[[Int]](count: n, repeatedValue: [Int](count: n, repeatedValue: 0))
var left = 0
var top = 0
var right = n - 1
var down = n - 1
var count = 1
while left <= right && top < down // shouble left <= right && top <= down
{
for j in (left...right)
{
matrix[top][j] = count
count += 1
}
top += 1
for i in (top...down)
{
matrix[i][right] = count
count += 1
}
right -= 1
for j in (left...right).reverse()
{
matrix[down][j] = count
count += 1
}
down -= 1
for i in (top...down).reverse()
{
matrix[i][left] = count
count += 1
}
left += 1
}
return matrix
}
}
var test = Solution()
var result = test.generateMatrix(3)
print(result)
这是我的结果,[ [ 1,2,3 ],[ 8,0,4 ],[ 7,6,5 ] ],缺少了9。我想我应该把while循环改为“left〈= right && top〈= down”,但是我得到了一个错误。
这个错误让我很困惑。因为在条件“左〈=右&&顶部〈=下”下,变量顶部没有机会越过变量下,但是,这个错误提醒我范围结束〈开始。
非常感谢你的帮助!真的很感谢你的时间。
2条答案
按热度按时间z31licg01#
看起来像是家庭作业,但我会咬一口。假设
i, j
是从0, 0
开始的行和列索引,螺旋运动可以描述如下:1.增加
j
,直到达到右侧的矩阵边界1.增加
i
,直到达到底部的矩阵边界1.减小
j
,直到到达左侧的矩阵边界1.减小
i
,直到达到顶部的矩阵边界1.重复步骤1 - 4,将“非空单元格”替换为“矩阵边界”
下面是代码:
~=
是“模式匹配”运算符。如果a <= c < b
,则a..<b ~= c
返回真gcmastyq2#
在末尾添加以下代码:
矩阵[(下+上)/ 2][(左+右)/ 2] = n * n
由于你的算法,中间的矩阵不能满足你的限制,
因此只需添加以下代码。
此外,n应该是奇数(1,3,5...),可以满足您的算法,这是应该考虑的。