第 43 日:顺时针打印矩阵
题目链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/
题目
解题
-
模拟
解题思路:
感觉这一题更偏向考察编程的逻辑方面,想象的执行情况如下图:
上面的过程最重要的是解决运行过程中的边界问题,分别有:
从外到内,共执行多少圈;
每一圈的横竖的界限是多少;
每一圈的起始位置(n+1,n+1);
解决掉这些问题后,接下来就比较轻松了,使用(i,j)
代表当前数的位置,每次小的循环执行一条箭头(如图),也就是共四个。
详细代码如下:
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix.length==0) return new int[0];
int[]res=new int[matrix.length*matrix[0].length];
int index=0;
//获取共打印多少个边框
int stop=matrix.length<matrix[0].length?(matrix.length+1)/2:(matrix[0].length+1)/2;
int h=matrix[0].length+2,s=matrix.length+2;
for (int q = 0; q < stop; q++) {
//当前边框的横、竖多少个
h-=2;
s-=2;
int i=q,j=q;
//上
for (int k = 1; k < h; k++) {
res[index++]=matrix[i][j++];
}
//右
for (int k = 1; k < s; k++) {
res[index++]=matrix[i++][j];
}
if(h==1){
res[index++]=matrix[i][j++];
break;
}else if(s==1){
res[index++]=matrix[i++][j];
break;
}
//下
for (int k = 1; k < h; k++) {
res[index++]=matrix[i][j--];
}
//左
for (int k = 1; k < s; k++) {
res[index++]=matrix[i--][j];
}
}
return res;
}
}