LeetCode解题 59:Spiral Matrix II
Problem 59: Spiral Matrix II [Medium]
Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
Example:
Input: 3
Output:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
来源:LeetCode
解题思路
与Problem 54 Spiral Matrix类似。
将二维数组由外圈至里圈拆分,每个圈的起点正好位于matrix[i][i]
,只需要写一个循环一圈的函数side_order()
,然后选择不同的起点调用该函数,一共调用
n
+
1
2
\frac{n+1}{2}
2n+1次。
具体过程:
- 创建
n
∗
n
n*n
n∗n数组
matrix
- 循环
n
+
1
2
\frac{n+1}{2}
2n+1次,每次选中的圈的四个顶点为:
t o p _ l e f t = [ s i d e , s i d e ] , top\_left = [side, side], top_left=[side,side],
t o p _ r i g h t = [ s i d e , n − s i d e − 1 ] , top\_right = [side, n-side-1], top_right=[side,n−side−1],
b o t t o m _ r i g h t = [ n − s i d e − 1 , n − s i d e − 1 ] , bottom\_right = [n-side-1, n-side-1], bottom_right=[n−side−1,n−side−1],
b o t t o m _ l e f t = [ n − s i d e − 1 , s i d e ] bottom\_left = [n-side-1, side] bottom_left=[n−side−1,side] - 顺时针遍历四条边依次填入递增元素
element
(1~n2):
[side
,side
~n-side-1
],
[side+1
~n-side-1
,n-side-1
],
[n-side-1
,n-side-2
~side
],
[n-side-2
~side+1
,side
] - 注意:当选中的圈的边长为1时,需要及时结束函数,避免重复选入。
整个算法只遍历一次数组,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
运行结果:
Solution (Java)
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
if(n == 1) return new int[][] {{1}};
int element = 1;
for(int i = 0; i < (n+1)/2; i++){
element = side_order(matrix, n, i, element);
}
return matrix;
}
private int side_order(int[][] matrix, int n, int side, int element){
for(int j = side; j < n - side; j++){
matrix[side][j] = element++;
}
if(side == n - side -1) return element;
for(int i = side + 1; i < n - side; i++){
matrix[i][n - side -1] = element++;
}
for(int j = n - side - 2; j >= side; j--){
matrix[n - side - 1][j] = element++;
}
for(int i = n - side - 2; i >= side + 1; i--){
matrix[i][side] = element++;
}
return element;
}
}