顺时针打印矩阵

题目地址: https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/

边界类型问题:
考虑设定矩阵的“左、上、右、下”四个边界,模拟以上矩阵遍历顺序。
在这里插入图片描述
设置上下左右四个边界变量:

 		//行 为下边界
        int row = matrix.length - 1;
        //列 为右边界
        int column = matrix[0].length - 1;
        int[] arr = new int[(row + 1) * (column + 1)];
        //l为左边界 x为上边界 
        int t = 0, l = 0, x = 0;

从左边界向右边界
从上边界向下边界
从右边界向左边界
从下边界向上边界

			//左至右
			for(int i = l; i <= column; i++) arr[t++] = matrix[l][i];
			//收缩边界
            if(++x > row) break;
            //上至下
            for(int i = x; i <= row; i++) arr[t++] = matrix[i][column];
            if(--column < l) break;
            //右至左
            for(int i = column; i >= l; i--) arr[t++] = matrix[row][i];
            if(--row < x) break;
            //下至上
            for(int i = row; i >= x; i--) arr[t++] = matrix[i][l];
            if(++l > column) break;

整合:

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length == 0) return new int[0];
        //顺时针打印
        //0,0  0,1  0,2  
        //1,0  1,1  1,2   
        //2,0  2,1  2,2   
        //行 为下边界
        int row = matrix.length - 1;
        //列 为右边界
        int column = matrix[0].length - 1;
        int[] arr = new int[(row + 1) * (column + 1)];
        //l为左边界 x为上边界 
        int t = 0, l = 0, x = 0;

     
        while(true){
            // -> right   上界l 下界column
            for(int i = l; i <= column; i++) arr[t++] = matrix[x][i];
            //判断是否越界  x为从上到下的上界 +1
            if( ++x > row) break;
            // -> bottom  上界x 下界row
            for(int i = x; i <= row; i++) arr[t++] = matrix[i][column];
            //column 为从右到左的 上界 -1
            if(--column < l) break;
            // -> left    上界column 下界l
            for(int i = column; i >= l; i--) arr[t++] = matrix[row][i];
            //row  为从下到上的 上界 -1
            if(-- row < x) break;
            // -> top 上界row 下界x
            for(int i = row; i >= x; i--) arr[t++] = matrix[i][l];
            //l为 从左到右的 上界 +1
            if( ++l > column) break;
        }
        return arr;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值