题目地址: 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;
}
}