算法27 Spiral Matrix

2018-05-13  本文已影响0人  holmes000

题目:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 :
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

思路:按顺时针获取数据输出,利用最大行列为基点,层层递进获取元素。
每次走一圈取数方式相同。

代码:

public List<Integer> spiralOrder(int[][] matrix) {
    List<Integer> output = new ArrayList<>();

    if (matrix.length < 1) {
        return output;
    }

    //矩阵的右下 行列最大元素(x,y)
    int x = matrix.length - 1;
    int y = matrix[0].length - 1;
    //矩阵的左上 (offset,offset)
    int offset = 0;
    while (true) {
        //从第1行, 左到右
        for (int i = offset; i <= y; i++) {
            output.add(matrix[offset][i]);
        }
        //从最后列 的第(offset+1)索引元素, 上到下
        for (int i = offset + 1; i <= x; i++) {
            output.add(matrix[i][y]);
        }
        //全部元素已输出
        if (x - offset == 0 || y - offset == 0) {
            return output;
        }

        //从最后一行的第(y-1) 索引元素,右到左
        for (int i = y - 1; i >= offset; i--) {
            output.add(matrix[x][i]);
        }
        //从第一列的第(x-1)索引元素,下到上
        for (int i = x - 1; i >= offset + 1; i--) {
            output.add(matrix[i][offset]);
        }

        x -= 1;
        y -= 1;
        offset += 1;//层层递进

        if (offset > x || y < offset) {
            return output;
        }
    }
}

时间复杂度:O(n2)
空间复杂度:O(1)

上一篇 下一篇

猜你喜欢

热点阅读