输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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
本题就算你想出了思路,你想要完成还是有一定难度的,需要仔细考虑边界问题。
我们需要按次序打印出每个数字,那我们可以模拟一下情况,其实就是向右,向下,向左,向上依次遍历整个数组,我们需要注意的是,每次都打印一个外围矩形,其实我们只要看到起点就可以了,起点的下标是11,22,33,44,...的点。永远在对角线上,那每次遍历我们都进行加一,我们找到规律当下标值start ,start ,如果start * 2 > row || start * 2 > column 就退出循环。
在循环内遍历即可,需要注意的是,你最后一次循环,可能访问的是一行,甚至一个数字,这些都要进行考虑。
因此在访问时先要进行判断。
代码如下:
class Solution {
int[] ans;
int index = 0;
public int[] spiralOrder(int[][] matrix) {
if (matrix.length == 0) return new int[0];
int row = matrix.length;
int column = matrix[0].length;
ans = new int[row * column];
int start = 0;
while ( column > 2 * start && row > 2 * start ){
fillIn(start,matrix,row,column);
start++;
}
return ans;
}
void fillIn(int start,int[][] matrix,int row,int column){
int endX = column - start - 1;
int endY = row - start - 1;
//向右移动
for (int i = start; i <= endX; i++){
ans[index++] = matrix[start][i];
}
//向下移动
for (int i = start + 1; i <= endY; i++){
ans[index++] = matrix[i][endX];
}
//向左移动 要想有向左移动,首先要求你有向下移动否则就是重复
if (endY > start && endX > start){
for (int i = endX -1; i >= start; i-- ){
ans[index++] = matrix[endY][i];
}
}
//向上移动 要求有向左移动
if (endX > start && endY > start + 1 ){
for (int i = endY - 1; i > start; i--){
ans[index++] = matrix[i][start];
}
}
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。