xiwenAndlejian / my-blog

Java基础学习练习题
1 stars 0 forks source link

54. 螺旋矩阵 #34

Open xiwenAndlejian opened 5 years ago

xiwenAndlejian commented 5 years ago

54. 螺旋矩阵

思路

题目要求:对一个mn列的矩阵,按照顺时针螺旋顺序返回所有元素。

可以采用分治的思想,将需要处理的矩阵一层一层拆分,可以得到以下情况:

根据上述分析,我们实际需要记录当前坐标的索引(x行,y列)以及沿此方向需遍历的元素个数即可。

方环四个边的长度

我们假设层数(level)从0开始。可以看出level的最大值为max(level) = min(m, n)/2

而方环实际上可以看作一个长方形,因此只需要知道它的长和宽就能知道它四个边对应的长度。

同理:最后一行(列)的长度也对应上述表达式。

public List<Integer> spiralOrder(int[][] matrix) {

    List<Integer> r = new LinkedList<>();
    if (matrix.length == 0)
        return r;
    int m = matrix.length, n = matrix[0].length;// Xmax = n - 1, Ymax = m - 1
    int min   = m > n ? n : m;
    for (int level = 0; (level << 1) < min; level++) {
        int x = n - 2 * level - 1, y = m - 2 * level - 1;
        int i = level, j = level;
        if (x == 0) {
            for (int s = 0; s <= y; s++)
                r.add(matrix[i++][j]);
        } else if (y == 0) {
            for (int s = 0; s <= x; s++)
                r.add(matrix[i][j++]);
        } else {
            for (int s = 0; s < x; s++)
                r.add(matrix[i][j++]);
            for (int s = 0; s < y; s++)
                r.add(matrix[i++][j]);
            for (int s = 0; s < x; s++)
                r.add(matrix[i][j--]);
            for (int s = 0; s < y; s++)
                r.add(matrix[i--][j]);
        }
    }
    return r;
}