您的位置:首页 > 其它

LeetCode Spiral Matrix

2015-06-28 12:18 417 查看
Description:

Given a matrix of m x n elements
(m rows, n columns),
return all elements of the matrix in spiral order.

Solution:

这道题目基本就是模拟

先说一个最基本的定义,layer表示一共进行了几圈螺旋的旋转数。可以很明显的得知,前面layer-1次的螺旋都是完整旋转。

这一部分没什么好说的,找出能够进行“完整”转圈的环,都是从(i,i) -> (i, n-1-i) -> (m-1-i, n-1-i) -> (i, i+1),其中i的取值是从0到layer-1。

下面比较容易绕的是最内层的循环,但还是先给出交给定义:

m_remain表示是完整的旋转圈数转完之后,还有几行没有进行旋转;n_remain类似,表示的还有几列没有旋转。这里有一个明显的性质,就是m_remain和n_remain至少有一个是小于等于1的,否则二者都大于等于2,则可以形成一个完整的旋转。

下面是“非完整”的旋转情况

m_remain==1 || n_remain==1



总结一下:这类对二维数组的处理,难点就是边界值的取值,+1和-1之类的会很复杂,需要仔细想想。

import java.util.*;

public class Solution {
int m, n, m_remain, n_remain;
ArrayList<Integer> list;

public List<Integer> spiralOrder(int[][] matrix) {
list = new ArrayList<Integer>();
m = matrix.length;
if (m == 0)
return list;
n = matrix[0].length;
int layer = Math.min((m + 1) / 2, (n + 1) / 2);
m_remain = m - 2 * (layer - 1);
n_remain = n - 2 * (layer - 1);

for (int i = 0; i < layer - 1; i++)
read(i, matrix);

if (m_remain == 1) {
for (int i = layer - 1; i < n - (layer - 1); i++)
list.add(matrix[layer - 1][i]);
} else if (n_remain == 1) {
for (int j = layer - 1; j < m - (layer - 1); j++)
list.add(matrix[j][layer - 1]);
} else {
read(layer - 1, matrix);
}
return list;
}

void read(int i, int[][] matrix) {
int a = i, b = i;
for (; b < n - 1 - i; b++)
list.add(matrix[a][b]);
for (; a < m - 1 - i; a++)
list.add(matrix[a][b]);
for (; b > i; b--)
list.add(matrix[a][b]);
for (; a > i; a--)
list.add(matrix[a][b]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: