题解 | #螺旋矩阵#
螺旋矩阵
https://www.nowcoder.com/practice/7edf70f2d29c4b599693dc3aaeea1d31
基本思路
螺旋矩阵每次遍历一个边界,因此可以设置上下左右四个边界,表示当前可以遍历边界,然后遍历顺序为上边界的左到右遍历,右边界的上到下遍历,下边界的右到左遍历,左边界的下到上遍历,每遍历完一个边界就往里移动边界,表示下一次可以遍历的边界,并判断边界是否合法,当上边界超过下边界,以及左边界超过右边界时,说明遍历结束。
参考
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; } }