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

目录

一、题目

二、思路

三、代码


一、题目

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

示例 1:

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

示例2:

输入: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]
 

限制:

0 <= matrix.length <= 100
0 <= matrix[i].length <= 100

二、思路

1、定义方向,【右、下、左、上】;

2、规定边界;

  • 1右:  (t,l),向右遍历,x轴 方向++,y轴 方向不变,随后t++,若t>b,遍历结束,退出循环;
  • 2下:(t,r)向下遍历,x轴 方向不变,y轴 方向++,随后r--;若l>r,遍历结束,退出循环;
  • 3左:(b,r)向左遍历,x轴方向--,y轴方向不变,随后b--; 若t>b,遍历结束,退出循环;
  • 4上:(b,l),向上遍历,x轴 方向不变,y轴 方向--,随后l++,若l>r,遍历结束,退出循环;

遍历完一个方向,边界就收缩一次,若未遍历完,就继续遍历另外一个方向。

三、代码

class Solution {
    public int[] spiralOrder(int[][] matrix) {
//        特殊情况 为空或者没有元素
        if(matrix==null||matrix.length ==0||matrix[0].length==0){
            return new int[0];
        }
//        定义四个边界
        int l=0,t=0,r=matrix[0].length-1,b= matrix.length-1;

        int[] res = new int[(r+1)*(b+1)];
        int k=0;

        while (true){
            //1、 一开始从左向右遍历(t,l)
            for (int i = t,j=l; j <=r ; j++) {
                res[k++]= matrix[i][j];
            }
            //  判断是否遍历完
            if(++t>b) break;

            //2、   从上往下遍历(t,r)
            for (int i = t,j=r; i <=b ; i++) {
                res[k++] = matrix[i][j];
            }

            //   判断是否遍历完
            if(l>--r) break;
            //   3、从右往左遍历(b,r)
            for (int i = b, j=r; j>=l ; j--) {
                res[k++]=matrix[i][j];
            }

            //  判断是否遍历完
            if(t>--b)break;
            //    4、从下往上遍历(b,l)
            for (int i =b , j=l; i >=t ; i--) {
                res[k++]=matrix[i][j];
            }
            //  判断是否遍历完
            if(++l>r) break;

        }
        return res;
    }
}

执行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值