Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
看到下图就懂了
看图可知,从左到右,从上到下,从右到左和从下到上四个方向构建一个循环
解题思路:
从这四个方向遍历,分别设置水平方法和垂直方向遍历的边界。每个方向遍历之后,需要重新更新相应的边界。当完成从左到右遍历时,因为已经完成当前上边界所在行的遍历,所以垂直方向的上边界往下移动一位,并且需要和下边界比较判断是否越界,如果越界,则退出循环;当完成从上到下的遍历时,因为已经完成当前右边界所在列的遍历,所以水平方向的右边界往前移动一位,并且需要和左边界比较判断是否越界,如果越界。则推出循环;当完成从下到上遍历时,因为已经完成当前左边界所在列的遍历,所以水平方向的左边界往右移动一位,并且需要和右边界比较判断是否越界,如果越界则退出循环。
public class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
//存放旋转后的数组元素
List<Integer> list = new ArrayList<Integer>();
if (matrix.length == 0) {
return list;
}
int beginX = 0, endX = matrix[0].length - 1;//水平方向
int beginY = 0, endY = matrix.length - 1;//竖直方向
while (true) {
//1.外围从左到右
for (int i = beginX; i <= endX; ++i) {
list.add(matrix[beginY][i]);
}
//判断是否越界(和下边界比)
if (++beginY > endY) break;
//2.从上到下
for (int i = beginY; i <= endY; ++i) {
list.add(matrix[i][endX]);
}
//判断是否越界(和左边界)
if (beginX > --endX) break;
//3.从右到左
for (int i = endX; i >= beginX; --i) {
list.add(matrix[endY][i]);
}
//判断是否越界(和上边界)
if (beginY > --endY) break;
//4.从下到上
for (int i = endY; i >= beginY; --i) {
list.add(matrix[i][beginX]);
}
//判断是否越界
if (++beginX > endX) break;
}
return list;
}
}
做这种题的时候一定要细心,先读懂题意,然后一步一步来,注意数组越界问题。只要把思路理清了,就不难了
Spiral Matrix II
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
因为矩阵是n*n的正方形,所以只需要两个边界:start和end,而且不需要每次单个方向遍历完成时更新边界值,而在每次循环结束时更新边界值即可。。边螺旋存入边赋值给数组,先存最上一行------->然后在最右列-------->底层--------->最左列,一点点。
public class Solution {
public int[][] generateMatrix(int n) {
//创建二维数组存储初始值
int[][] matrix = new int[n][n];
int num =1;
int start = 0;
int end = n-1;
//边螺旋写入边赋值
while (start < end) {
//先写入第一行,第一个[]值不变,第二个[]里的值递增,依次赋值
for (int i = start; i < end; i++) {
matrix[start][i] = num;
num++;
}
//再写入最右侧一列,所以第一个[]里的值固定为end,第一个[]里的值递增,依次赋值
for (int i = start; i < end; i++) {
matrix[i][end] = num;
num++;
}
//再写最底层,所以第一个[]里的值固定为end,第二个[]里的值递减,依次赋值
for (int i = end; i > start; i--) {
matrix[end][i] = num;
num++;
}
//接下来写去最左侧,第二个[]里的值固定为start,第一个[]里的值递减,依次赋值
for (int i = end; i > start; i--) {
matrix[i][start] = num;
num++;
}
start++;
end--;
}
if(start==end)
{
matrix[start][start]=num;
}
return matrix ;
}
}
总而言之,就是一定要细心啊。。。绕的自己都蒙了,因为对二维数组用起来还不太熟悉