题目:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 :
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
思路:按顺时针获取数据输出,利用最大行列为基点,层层递进获取元素。
每次走一圈取数方式相同。
代码:
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> output = new ArrayList<>();
if (matrix.length < 1) {
return output;
}
//矩阵的右下 行列最大元素(x,y)
int x = matrix.length - 1;
int y = matrix[0].length - 1;
//矩阵的左上 (offset,offset)
int offset = 0;
while (true) {
//从第1行, 左到右
for (int i = offset; i <= y; i++) {
output.add(matrix[offset][i]);
}
//从最后列 的第(offset+1)索引元素, 上到下
for (int i = offset + 1; i <= x; i++) {
output.add(matrix[i][y]);
}
//全部元素已输出
if (x - offset == 0 || y - offset == 0) {
return output;
}
//从最后一行的第(y-1) 索引元素,右到左
for (int i = y - 1; i >= offset; i--) {
output.add(matrix[x][i]);
}
//从第一列的第(x-1)索引元素,下到上
for (int i = x - 1; i >= offset + 1; i--) {
output.add(matrix[i][offset]);
}
x -= 1;
y -= 1;
offset += 1;//层层递进
if (offset > x || y < offset) {
return output;
}
}
}
时间复杂度:O(n2)
空间复杂度:O(1)
网友评论