基本思路
螺旋矩阵每次遍历一个边界,因此可以设置上下左右四个边界,表示当前可以遍历边界,然后遍历顺序为上边界的左到右遍历,右边界的上到下遍历,下边界的右到左遍历,左边界的下到上遍历,每遍历完一个边界就往里移动边界,表示下一次可以遍历的边界,并判断边界是否合法,当上边界超过下边界,以及左边界超过右边界时,说明遍历结束。
参考
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix int整型二维数组
* @return int整型ArrayList
*/
public ArrayList<Integer> spiralOrder (int[][] matrix) {
// write code here
ArrayList<Integer> res = new ArrayList<>(); // 用于存放遍历的节点
if (matrix.length == 0) { // 矩阵为空返回空的结果数组
return res;
}
// 设置上下左右四个边界,每次遍历到边界都将边界进行修改,表示边界外的元素已经遍历完了
int up = 0;
int down = matrix.length - 1;
int left = 0;
int right = matrix[0].length - 1;
while (left <= right && up <= right) { // 循环条件为左边界小于等于右边界以及上边界小于等于下边界
// 先遍历上边界从左到右中的元素
for (int i = left; i <= right; ++i) {
res.add(matrix[left][i]);
}
up++; // 上边界遍历完则下移边界
if (up > down) { // 防止边界越界
break;
}
// 右边界从上到下遍历元素
for (int i = up; i <= down; ++i) {
res.add(matrix[i][right]);
}
right--; // 右边界遍历完左移边界
if (left > right) {
break;
}
// 下边界从右到左遍历
for (int i = right; i >= left; --i) {
res.add(matrix[down][i]);
}
down--; // 下边界遍历完往上移动边界
if (up > down) {
break;
}
// 左边界从下到上遍历
for (int i = down; i >= up; --i) {
res.add(matrix[i][left]);
}
left++; // 左边界遍历完往右移动
if (left > right) {
break;
}
}
return res;
}
}



京公网安备 11010502036488号