面试题29. 顺时针打印矩阵

本文详细解析了如何按螺旋顺序打印矩阵元素的算法,通过定义边界变量,实现从外向内的顺时针打印,适用于0<=matrix长度<=100的矩阵。

题目

输入一个矩阵,要求按照从外向里顺时针依次打印出每一个数字。
示例:
输入:
matrix =[[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100

本题与LeetCode 54题相同:https://leetcode-cn.com/problems/spiral-matrix/

算法思路

按照题目要求,打印顺序依次为 从左到右 -> 从上达到下 -> 再从右往左 -> 再从下往上直到所有数据都访问了。

步骤:

  • 首先需要定义几个变量并初始化,矩阵的上下左右边界–>t、d、l、r;
  • 然后再依次循环打印矩阵,从左向右,从上往下,从右往左,从下往上,每个方向都要注意边界,本行或本列打印完后边界需要向内收缩,每次收敛的都不同。如从左到右打印完了一行,说明该行已经打印,所以对于top就需要自增1;再从上往下打印了一列,说明该列打印了,列数right自减1;再从右往左打印了以行,说明改行已打印,行数down自减1;再然后从下往上打印一列,边界是不超过top,行数left自增1。

代码

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
            return new int[0];
        int m = matrix.length,n = matrix[0].length;
        int l = 0,r = n-1,t = 0,d = m-1,index = 0; //初始化几个变量左,右,上,下
        int[] res = new int[m*n];
        while(l <= r && t <= d){ //循环结束条件
            for(int i = l; i <= r; i++){  //从左至右,从l开始,直到r
                res[index++] = matrix[t][i];
            }
            t++; //更新top,向下移动一行
            for(int i = t;i <= d;i++){ //从上至下,从t开始,直到d
                res[index++] = matrix[i][r];
            }
            r--;//更新right,向左移动一行
            for(int i = r;i >= l && t <= d;i--){//从右向左,r -->  l
                res[index++] = matrix[d][i];
            }           
            d--;//更新down,向上移动一行
            for(int i = d;i >= t && l <= r;i--){ //从下往上, d --> t
                res[index++] = matrix[i][l];
            }
            l++;//更新left,向右移动一行
        }
        return res;
    }
}

本题最需要注意的就是几个边界的处理,每次循环的开始和结束。

复杂度
时间复杂度:O(MN),M是矩阵的行数,N是矩阵的列数
空间复杂度 :O(1)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值