LeetCode 54 Spiral Matrix

LeetCode 54 Spiral Matrix

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,Given the following matrix:
[[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]]
You should return [1,2,3,6,9,8,7,4,5].

旋转matrix这种corner case极多的题一直是软肋。。。真的是智商不够用啊。。。看了各路大神的解法,有递归,有数学解,最关键的还是理解终止条件与边界条件的判断。挑了一个最容易实现的版本,还有待继续理解熟练!!!

思路一:
一般走path的题,都可以用dir变量表示上下左右的方向。除此之外,本题的关键是理解终止条件:

行或列均没有格子可以走了!!!
那到底每行与每列可以走多少格子呢?
以row为例:
假设有0~m-1一共m行,已经走了r行,
那么还可以走m-r个格子。
从遍历一开始,有m个格子可以走,到最后只剩0个的时候跳出循环!

思路二:
和之前的一样,但可以略去dir变量,因为本题遍历方向的变化是存在规律的,即行向右,列向下,行向左,列向上,因此用一个循环模拟这四个步骤即可。关键还是判断什么时候终止,且每次走几步。要明白每完成一次行扫描或列扫描,对应的需要扫描的行数与列数都减1!!!

public class Solution {
    public List spiralOrder(int[][] matrix) {
        List path = new ArrayList<>();
        if (matrix.length == 0) return path;
        
        int rowStart = 0, rowEnd = matrix.length-1, colStart = 0, colEnd = matrix[0].length-1;
             
        // Until it reach the spiral center that is rowStart > rowEnd or colStart > colEnd
        while (true) {
            // Right
            for (int j = colStart; j <= colEnd; j++) {
                path.add(matrix[rowStart][j]);
            }
            rowStart++;
            if (rowStart > rowEnd) break;
            
            // Down
            for (int i = rowStart; i <= rowEnd; i++) {
                path.add(matrix[i][colEnd]);
            }
            colEnd--;
            if (colStart > colEnd) break;
            
            // Left
            for (int j = colEnd; j >= colStart; j--) {
                path.add(matrix[rowEnd][j]);
            }
            rowEnd--;
            if (rowStart > rowEnd) break;
            
            // Up
            for (int i = rowEnd; i >= rowStart; i--) {
                path.add(matrix[i][colStart]);
            }
            colStart++;
            if (colStart > colEnd) break;
        }
        
        return path;
    }
}

你可能感兴趣的:(LeetCode 54 Spiral Matrix)