【剑指offer 29】顺时针打印矩阵(Java)

该博客介绍了一种算法问题,即如何按照顺时针顺序打印矩阵中的所有数字。提供了详细的解题思路和代码实现,包括从左到右、从上到下、从右到左和从下到上的四个步骤,确保覆盖所有元素。示例展示了不同大小的矩阵输入和对应的输出结果。此外,还给出了问题的限制条件和解题过程中用到的边界判断。
摘要由CSDN通过智能技术生成

【题目描述】

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

【样例示例】

示例 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开始一个个打印,步骤如下:

  • 初始化上下左右的值:left,right,top,bottom,存储打印数字的数组a
  • 第一步:第一行从左往右打印,存进a,存完后top+1,如果top>bottom,说明上下循环完毕,已经遍历完全部了,跳出循环;
  • 第二步:最后一列从上往下打印,存进a,存完后right-1,如果right<left,说明左右循环完毕,已经遍历完全部了,跳出循环;
  • 第三步:最后一行从右往左打印,存进a,存完后bottom-1,如果bottom<top,说明上下循环完毕,已经遍历完全部了,跳出循环;
  • 第四步:第一列从下往上打印,存进a,存完后left+1,如果left>right,说明左右循环完毕,已经遍历完全部了,跳出循环;
  • 从第一步继续循环,直到跳出循环,打印完全部数字。
class Solution {
    public int[] spiralOrder(int[][] matrix) {
    	// 特判
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return new int[0];
        }
        int flag=0;	// 存储数组位置
        int rows = matrix.length, columns = matrix[0].length;
        int left = 0, right = columns - 1, top = 0, bottom = rows - 1;
        int a[] = new int[rows*columns];  
        while(true) {
        	// 从左往右打印
        	for(int i=left;i<=right;i++) {
        		a[flag++] = matrix[top][i];
        	}
        	// 第一行打印完毕,下次将从第二行开始
        	top++;
        	if(top>bottom)
        		break;
        	// 从上往下打印
        	for(int i=top;i<=bottom;i++) {
        		a[flag++] = matrix[i][right];
        	}
        	// 最后一列打印完毕,下次将从倒数第二列开始
        	right--;
        	if(right<left)
        		break;
        	// 从右往左打印
        	for(int i=right;i>=left;i--) {
        		a[flag++] = matrix[bottom][i];
        	}
        	// 最后一行打印完毕,下次将从倒数第二列开始
        	bottom--;
        	if(bottom<top)
        		break;
        	// 从下往上打印
        	for(int i=bottom;i>=top;i--) {
        		a[flag++] = matrix[i][left];
        	}
        	// 第一列打印完毕,下次将从第二列开始
        	left++;
        	if(left>right)
        		break;
        }
        return a;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值