54. 螺旋矩阵
思路:
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
画每四条边,每画一条边都要坚持一致的左闭右开
考虑到矩阵为正方形和长方形的两种情况,所以每次放入一个元素就减一。
代码实现
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
LinkedList<Integer> list = new LinkedList<>();
int left = 0;
int right = matrix[0].length - 1;
int top = 0;
int bottom = matrix.length - 1;
int row = matrix.length;
int column = matrix[0].length;
int numElement = row * column;
while (top <= bottom) {
for (int i = 0; i < right - left && numElement > 0; i++) {
list.add(matrix[top][left + i]);
numElement--;
}
for (int i = 0; i < bottom - top && numElement > 0 ; i++) {
list.add(matrix[top + i][right]);
numElement--;
}
for (int i = 0; i < right - left && numElement > 0 ; i++) {
list.add(matrix[bottom][right - i]);
numElement--;
}
for (int i = 0; i < bottom - top && numElement > 0; i++) {
list.add(matrix[bottom - i][left]);
numElement--;
}
if (left == right && top == bottom) {
list.add(matrix[left][left]);
}
top++;
left++;
right--;
bottom--;
}
return list;
}
}