Spiral Matrix I & II

lpy1990

Spiral Matrix

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]

思路

遍历数组的顺序是先向右然后下, 左, 上 然后右。。。
如果是一个4*4的矩阵, 对于最外面一圈相当于从[0,0]向右走3, 走到[0,2], 然后从[0,3]开始向下走3 走到[2,3] 然后从[3,3]向左走3 走到[3,1] 然后从[3,0]向上走3 走到[1,0]
可以看到对第i行, 他的对应坐标是i, m-i-1, 对于第j列 坐标是n-j-1

另外一个需要考虑的就是因为矩阵可能不是对称矩阵, 所以遍历完可能会出现多出一行或者一列的情况. 如果行列中最小的一个是单数, 那么则会出现这种情况, 所以最后需要盘点行/列中最小的是否是单数, 如果是则要把最后一行/列顺序遍历读出来

复杂度

时间复杂度O(mn)空间O(mn)

代码

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        if (matrix.length == 0) {
            return res;
        }
        int m = matrix.length;
        int n = matrix[0].length;
        int mid = Math.min(m, n)/2;
        for (int i = 0; i < mid; i++) {
            //向右
            for (int j = i; j < n - i - 1; j++) {
                res.add(matrix[i][j]);
            }
            //向下
            for (int j = i; j < m - i -1; j++) {
                res.add(matrix[j][n-i-1]);
            }
            //向左
            for (int j = n - i - 1; j > i; j--) {
                res.add(matrix[m-i-1][j]);
            }
            //向上
            for (int j = m - i -1; j > i; j--) {
                res.add(matrix[j][i]);
            }
        }
        //如果多一行或者一列
        if (Math.min(m, n)%2 == 1) {
            if (m < n){//添加中间一行
                for (int j = mid; j < n -mid; j++) {
                    res.add(matrix[mid][j]);
                }
            } else {//添加中间一列
                for (int j = mid; j < m - mid; j++) {
                    res.add(matrix[j][mid]);
                }
            }
        }
        return res;
    }
}

59. Spiral Matrix II

Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

Example:

Input: 3
Output:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

思路

这道题相当于是m和n相等的第一道题, 向上下左右的遍历的方式是一样的. 唯一不同是如果n为单数, 中间的数字是无法遍历到的. 所以要判定n是不是奇数, 如果是奇数要单独加上中间的值intmid

复杂度

时间O(nn) 空间O(nn)

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        if (n == 0) {
            return res;
        } 
        int mid = n/2;
        int k = 1;
        for (int i = 0; i < mid; i++) {
            for (int j = i; j < n -i - 1; j++) {//向右
                res[i][j] = k++;
            }
            for (int j = i; j < n - i - 1; j++) {//向下
                res[j][n-i-1] = k++;
            }
            for (int j = n - i - 1; j>i ; j--) { //向左
                res[n-i-1][j] = k++;
            }
            for (int j = n - i -1; j> i;j--) { //向上
                res[j][i] = k++;
            }
        }
        if (n%2 == 1) {
            res[mid][mid] = k;
        }
        return res;

    }
}
阅读 1.1k

26 声望
10 粉丝
0 条评论
26 声望
10 粉丝
文章目录
宣传栏