剑指 Offer 29(数组5).顺时针打印矩阵

剑指 Offer 29(数组5).顺时针打印矩阵

问题描述:

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

示例

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

解题思路:思路链接

考虑设定矩阵的“左、上、右、下”四个边界,模拟以上矩阵遍历顺序。

image-20210909145150781

矩阵共有上(top)下(bottom)左(left)右(right)四个边界,每次一旦遍历到了边界就转换方向,并且边界缩紧。

总共四个遍历方向:

  1. 左 -> 右,res.append(matrix[top][i]),遍历到边界后,top下移;
  2. 上 -> 下,res.append(matrix[i][right]),遍历到边界后,right左移;
  3. 右 -> 左,res.append(matrix[bottom][i]),遍历到边界后,bottom上移;
  4. 下 -> 上,res.append(matrix[i][left]),遍历到边界后,left右移;

使用递归代码实现:

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        //判断矩阵是否为空
        if(matrix.length == 0 || matrix == null){
            return new int[0];
        }
        //根据顺时针的运动方式建立初始指针
        int n = matrix.length,m = matrix[0].length;
        int left = 0,top = 0,right = m - 1,bottom = n - 1;
        //建立返回的数组
        int[] number = new int[m * n];
        int index = 0;
        while(true){
            //从矩阵位置(0,0)开始从左到右
            for(int i = left;i <= right;i++){
                number[index++] = matrix[top][i];
            }
            //遍历完此行top值下移,直到大于bottom值
            top++;
            if(top > bottom){
                break;
            }
            //从上到下
            for(int i = top;i <= bottom;i++){
                number[index++] = matrix[i][right];
            }
            right--;
            if(right < left){
                break;
            }
            //从右到左
            for(int i = right;i >= left;i--){
                number[index++] = matrix[bottom][i];
            }
            bottom--;
            if(bottom < top){
                break;
            }
            //从下到上
            for(int i = bottom;i >= top;i--){
                number[index++] = matrix[i][left];
            }
            left++;
            if(left > right){
                break;
            }
        }
        return number;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原来如此呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值