LeetCode54. 螺旋矩阵

LeetCode54. 螺旋矩阵

题目描述

 /**
     * 
     * 给你一个 m 行 n 列的矩阵 matrix ,
     * 请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
     * 
     */

思路分析

  1. 螺旋矩阵,即螺旋输出矩阵,即将每层按照顺时针的方式将其元素保存在集合中然后输出
  2. 定义四个变量 left right top bottom 分别表示每一层的四条边,则每次循环输出每条边的元素即可
  3. 考虑矩阵即二维数组行和列不相等的情况
  4. 如果行和列不相等,则最内层的元素不会再构成一个矩阵,要么是一行,要么是一列,则需要添加判断条件,每行或者列只需要输出依次即可
  5. 源码及详解见下

源码及分析

/**
     * 
     * @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;
    }
posted @ 2021-06-03 10:44  mx_info  阅读(51)  评论(0)    收藏  举报