Matrix相关

Spiral Matrix

  • 面试好题,思路多少有一点,但是想要bug free没有那么容易

  • clean code就更难了

  • iterate from 4 direcitons, right, down, left, up

  • always iterate between rowStart and rowEnd, colStart and colEnd

  • need to make sure while (rowStart <= rowEnd && colStart <= colEnd) {}

  • 发现一个switch case 的写法,代码简单易懂

public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return res;
        
        int rowStart = 0, rowEnd = matrix.length - 1, colStart = 0, colEnd = matrix[0].length - 1;
        int dir = 0;
        while (rowStart <= rowEnd && colStart <= colEnd) {
            switch(dir) {
                case 0: //right 
                    for (int j = colStart; j <= colEnd; j++) {
                        res.add(matrix[rowStart][j]);
                    }
                    rowStart++;
                    break;
                    
                case 1: //down
                    for (int i = rowStart; i <= rowEnd; i++) {
                        res.add(matrix[i][colEnd]);
                    }
                    colEnd--;
                    break;
                
                case 2: //left
                    for (int j = colEnd; j>= colStart; j--) {
                        res.add(matrix[rowEnd][j]);
                    }
                    rowEnd--;
                    break;
                    
                case 3: //up
                    for (int i = rowEnd; i >= rowStart; i--) {
                        res.add(matrix[i][colStart]);
                    }
                    colStart++;
                    break;
            }
            dir = (dir + 1) % 4;
        }
        return res;
    }

Spiral Matrix II

  • 给定n, generate出一个from 1 to n * n的 spiral matrix

  • 套用第一题的代码,稍作修改就好

public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        int rowStart = 0, colStart = 0, rowEnd = n - 1, colEnd = n - 1;
        int dir = 0;
        int num = 1;
        while (rowStart <= rowEnd && colStart <= colEnd) {
            switch(dir) {
                case 0: //right 
                    for (int j = colStart; j <= colEnd; j++) {
                        matrix[rowStart][j] = num++;
                    }
                    rowStart++;
                    break;
                    
                case 1: //down
                    for (int i = rowStart; i <= rowEnd; i++) {
                        matrix[i][colEnd] = num++;
                    }
                    colEnd--;
                    break;
                
                case 2: //left
                    for (int j = colEnd; j>= colStart; j--) {
                        matrix[rowEnd][j] = num++;
                    }
                    rowEnd--;
                    break;
                    
                case 3: //up
                    for (int i = rowEnd; i >= rowStart; i--) {
                        matrix[i][colStart] = num++;
                    }
                    colStart++;
                    break;
            }
            dir = (dir + 1) % 4;
        }
        return matrix;
    }

Last updated

Was this helpful?