题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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
Java解法:
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return new int[0];
}
int rows = matrix.length -1;
int columns = matrix[0].length - 1;
int row = 0;
int column = 0;
int curIndex = 0;
//初始化一个数组用来存储输出的元素
int[] ans = new int[(rows + 1) * (columns + 1)];
//每次打印一圈(以第一圈为例,从matrix[0][0]开始),一圈分为四步:
//第一步:从左到右, matrix[0][0]到matirx[0][columns]
//第二步:从上到下, matrix[1][0]到matirx[0][rows]
//第三步:从右向左, matrix[rows][columns - 1]到matirx[rows][0]
//第四步:从下到上, matrix[rows - 1][0]到matirx[1][0]
//下一圈从matrix[1][1]开始...
//但是最后一圈可能退化为,只有一行,只有一列等,那么左后一圈可能不需要四步
//因此我们需要判断打印每一步的前提条件
while(column <= columns && row <= rows)
{
//第一步总是需要的,因为打印一圈至少需要一步
for(int i = row; i <= columns; i++)
{
ans[curIndex++] = matrix[row][i];
}
//第二步的条件是终止行号大于起始行号
for(int i = row + 1; i <= rows; i++)
{
ans[curIndex++] = matrix[i][columns];
}
//第三步的条件是终止列号大于起始列号
if(row < rows && column < columns)
{
for(int i = columns - 1; i >= column; i--)
{
ans[curIndex++] = matrix[rows][i];
}
for(int i = rows - 1; i >= row + 1; i--)
{
ans[curIndex++] = matrix[i][column];
}
}
column ++;
row ++;
columns --;
rows --;
}
return ans;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof