LeetCode54. 螺旋矩阵
题目描述
/**
*
* 给你一个 m 行 n 列的矩阵 matrix ,
* 请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
*
*/
思路分析
- 螺旋矩阵,即螺旋输出矩阵,即将每层按照顺时针的方式将其元素保存在集合中然后输出
- 定义四个变量 left right top bottom 分别表示每一层的四条边,则每次循环输出每条边的元素即可
- 考虑矩阵即二维数组行和列不相等的情况
- 如果行和列不相等,则最内层的元素不会再构成一个矩阵,要么是一行,要么是一列,则需要添加判断条件,每行或者列只需要输出依次即可
- 源码及详解见下
源码及分析
/**
*
* @param matrix 要螺旋输出的矩阵
* @return 返回螺旋后的结果
*/
public List<Integer> spiralOrder(int[][] matrix) {
//定义 rows 和 col 保存二维数组的行和列
int rows = matrix.length;
int col = matrix[0].length;
//定义集合保存螺旋后的元素
List<Integer> list = new ArrayList<>();
//定义四个变量,保存最外层的 上下左右 四条边
int left = 0, right = col - 1, top = 0, bottom = rows - 1;
//循环从外向内依次遍历每一层,将遍历到的元素田间添加到集合
while (left <= right && top <= bottom) {
//遍历最外层所有元素
//上侧
for (int i = left; i <= right; i++) {
list.add(matrix[top][i]);
}
//右侧
for (int i = top + 1; i <= bottom; i++) {
list.add(matrix[i][right]);
}
//下侧
if (bottom != top) {
for (int i = right - 1; i >= left; i--) {
list.add(matrix[bottom][i]);
}
}
//左侧
if (left != right) {
for (int i = bottom - 1; i > top; i--) {
list.add(matrix[i][left]);
}
}
//改变变量,即遍历内层元素
left++;
right--;
top++;
bottom--;
}
return list;
}