59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix
Solution: 使用上下左右四个指针up, down, left, right即可,遵循左→右上→下右→左下→上的顺序填充即可。

class Solution {
    public int[][] generateMatrix(int n) {
        int up = 0, down = n - 1, left = 0, right = n - 1, i = 1, idx;
        int[][] result = new int[n][n];
        while (i <= n * n) {
            for (idx = left; idx <= right; ++idx) {
                result[up][idx] = i++;
            }
            ++up;
            for (idx = up; idx <= down; ++idx) {
                result[idx][right] = i++;
            }
            --right;
            for (idx = right; idx >= left; --idx) {
                result[down][idx] = i++;
            }
            --down;
            for (idx = down; idx >= up; --idx) {
                result[idx][left] = i++;
            }
            ++left;
        }
        return result;
    }
}

54. 螺旋矩阵

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
Solution: 本题解法与上题类似,同样是上下左右四个指针,不过由于只是遍历所以不需要变量i(上题中变量i的目的是维护当前填充元素值),故在遍历过程中需要注意保持top ≤ down 以及 left ≤ right, 一旦某次指针变动后该条件被违反,那么说明遍历结束,立即跳出while循环。

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        List<Integer> result = new ArrayList<Integer>(m * n);
        int up = 0, down = m - 1, left = 0, right = n - 1, idx;
        while (true) {
            for (idx = left; idx <= right; ++idx) {
                result.add(matrix[up][idx]);
            }
            if (++up > down) break;;
            for (idx = up; idx <= down; ++idx) {
                result.add(matrix[idx][right]);
            }
            if (--right < left) break;
            for (idx = right; idx >= left; --idx) {
                result.add(matrix[down][idx]);
            }
            if (--down < up) break;
            for (idx = down; idx >= up; --idx) {
                result.add(matrix[idx][left]);
            }
            if (++left > right) break;
        }
        return result;
    }
}