Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
Example 1:
Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] Output: [1,2,3,4,8,12,11,10,9,5,6,7]
这道题就是给你一个数组,按照它给定的顺序读数,一开始看到这道题我有点懵没啥思路,但是仔细想后发现它总是按照右下左上的顺序移动,于是我就创建了一个路径数组route,走过的地方标1,没走过的地方是0,依照route数组和不断的循环移动求解。
class Solution {
public static List<Integer> spiralOrder(int[][] matrix) {
List<Integer>res=new ArrayList<>();
int row=matrix.length;
if(row==0)
return res;
int col=matrix[0].length;
int [][]route=new int[row][col];
route[0][0]=1;
res.add(matrix[0][0]);
int i=0,j=0;
while(((j+1)<col&&route[i][j+1]==0)||((i+1)<row&&route[i+1][j]==0))
{
while((j+1<col)&&route[i][j+1]==0)
{
res.add(matrix[i][j+1]);
route[i][j]=1;
j++;
}
while((i+1)<row&&route[i+1][j]==0)
{
res.add(matrix[i+1][j]);
route[i][j]=1;
i++;
}
while((j-1)>=0&&route[i][j-1]==0)
{
res.add(matrix[i][j-1]);
route[i][j]=1;
j--;
}
while((i-1)>=0&&route[i-1][j]==0)
{
res.add(matrix[i-1][j]);
route[i][j]=1;
i--;
}
}
return res;
}
}
下一题其实就是一个小小的变形,给出一个n,构造n*n的数组,只要会了第一题这题稍微改改就行了
class Solution {
public static int[][] generateMatrix(int n) {
int [][]res=new int[n][n];
int [][]route=new int[n][n];
route[0][0]=1;
int col=n,row=n;
int i=0,j=0,k=1;
while(((j+1)<col&&route[i][j+1]==0)||((i+1)<row&&route[i+1][j]==0))
{
while((j+1<col)&&route[i][j+1]==0)
{
res[i][j]=k;
route[i][j]=1;
k++;
j++;
}
while((i+1)<row&&route[i+1][j]==0)
{
res[i][j]=k;
route[i][j]=1;
k++;
i++;
}
while((j-1)>=0&&route[i][j-1]==0)
{
res[i][j]=k;
route[i][j]=1;
k++;
j--;
}
while((i-1)>=0&&route[i-1][j]==0)
{
res[i][j]=k;
route[i][j]=1;
k++;
i--;
}
}
res[i][j]=k;
return res;
}
}