美文网首页
LeetCode 54 Spiral Matrix

LeetCode 54 Spiral Matrix

作者: ShuiLocked | 来源:发表于2016-08-20 11:10 被阅读397次

    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<Integer> spiralOrder(int[][] matrix) {
            List<Integer> 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

          本文链接:https://www.haomeiwen.com/subject/fjhisttx.html