题解 | #螺旋矩阵#

螺旋矩阵

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;
    }
}

全部评论

相关推荐

xxxxOxo:该催就催,想要你的不会因为催就挂,催了就挂的是因为本来就要挂你
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务