剑指Offer-29-顺时针打印矩阵

剑指Offer-29题

题目描述:顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

剑指Offer-29-顺时针打印矩阵_第1张图片

**题解思路:**使用 模拟 的方法

  1. 定义四个边界变量表示当前要遍历的边界:上(top)、下(bottom)、左(left)、右(right),条件结束的标志是[上边界<=下边界 且 左边界<=有边界]
  2. 再顺时针打顺序依次遍历矩阵的每一圈,并将每一个遍历到的元素添加到列表中,并更新边界的位置,继续下一轮的遍历,遍历顺序为:
    • 从左到右
    • 从上到下
    • 从右到左
    • 从下到上

代码如下:

class Solution {
    /**
     * 解题思路:使用 模拟 的方法
     */
    public int[] spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        if (matrix.length == 0 || matrix[0].length == 0 || matrix == null) return list.stream().mapToInt(Integer::intValue).toArray();

        //定义四个边界:上、下、右、左
        int top = 0, bottom = matrix.length-1, left = 0, right = matrix[0].length-1;
        while (top<=bottom && left<=right){
            //从左至右遍历
            for (int i=left;i<=right;i++){
                list.add(matrix[top][i]);
            }
            top++;//最上面一行遍历结束,向下移一行

            //从上到下遍历
            for (int i=top;i<=bottom;i++){
                list.add(matrix[i][right]);
            }
            right--;//最右边一列遍历结束,向左移一列

            //查看是否有剩余
            if (top<=bottom && left<=right){
                //从右向左遍历
                for (int i=right;i>=left;i--){
                    list.add(matrix[bottom][i]);
                }
                bottom--;//最下面的一行遍历结束,向上移一行

                //从下到上遍历
                for (int i=bottom;i>=top;i--){
                    list.add(matrix[i][left]);
                }
                left++;//最左边一列遍历结束,向右移一列
            }
        }
        return list.stream().mapToInt(Integer::intValue).toArray();//将 list->int[]
    }
}

你可能感兴趣的:(剑指Offer,Java,leetcode)