题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路及代码
使用一个变量q,记录一共跑了多少圈,跑完上下左右四步之后算一圈。走完一圈之后将横纵坐标归0。之后每往里一圈取值为matrix[l+q][w+q],特殊情况,每圈的最后一步取值注意从左下往上不取最后一个值,因为最后一个值已经在第一步的时候取出了。
大概流程如下图
public int[] spiralOrder(int[][] matrix) {
if(matrix.length==0) return new int[0];
int length = matrix[0].length; //横向
int width = matrix.length; //纵向
int count = length * width;
int arr[] = new int [count];
int q = 0;
int index = 0;
int l = 0;
int w = 0;
while (index < arr.length) {
// 从左上往右上
while (l + q <= length - 1 - q && index<arr.length) {
arr[index++] = matrix[w + q][l + q];
l++;
}
l--;
w++;
// 从右上往右下
while (w + q <= width - 1 - q && index<arr.length) {
arr[index++] = matrix[w + q][l + q];
w++;
}
w--;
l--;
// 从右下往左下
while (l >= 0 && index<arr.length) {
arr[index++] = matrix[w+q][l+q];
l--;
}
l++;
w--;
// 从左下往上
while (w > 0 && index<arr.length) {
arr[index++] = matrix[w+q][l+q];
w--;
}
q++;
l = 0;
w = 0;
}
return arr;
}