剑指 Offer 29(数组5).顺时针打印矩阵
问题描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
输入: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]
解题思路:思路链接
考虑设定矩阵的“左、上、右、下”四个边界,模拟以上矩阵遍历顺序。
矩阵共有上(top)下(bottom)左(left)右(right)四个边界,每次一旦遍历到了边界就转换方向,并且边界缩紧。
总共四个遍历方向:
- 左 -> 右,res.append(matrix[top][i]),遍历到边界后,top下移;
- 上 -> 下,res.append(matrix[i][right]),遍历到边界后,right左移;
- 右 -> 左,res.append(matrix[bottom][i]),遍历到边界后,bottom上移;
- 下 -> 上,res.append(matrix[i][left]),遍历到边界后,left右移;
使用递归代码实现:
class Solution {
public int[] spiralOrder(int[][] matrix) {
//判断矩阵是否为空
if(matrix.length == 0 || matrix == null){
return new int[0];
}
//根据顺时针的运动方式建立初始指针
int n = matrix.length,m = matrix[0].length;
int left = 0,top = 0,right = m - 1,bottom = n - 1;
//建立返回的数组
int[] number = new int[m * n];
int index = 0;
while(true){
//从矩阵位置(0,0)开始从左到右
for(int i = left;i <= right;i++){
number[index++] = matrix[top][i];
}
//遍历完此行top值下移,直到大于bottom值
top++;
if(top > bottom){
break;
}
//从上到下
for(int i = top;i <= bottom;i++){
number[index++] = matrix[i][right];
}
right--;
if(right < left){
break;
}
//从右到左
for(int i = right;i >= left;i--){
number[index++] = matrix[bottom][i];
}
bottom--;
if(bottom < top){
break;
}
//从下到上
for(int i = bottom;i >= top;i--){
number[index++] = matrix[i][left];
}
left++;
if(left > right){
break;
}
}
return number;
}
}