【LeetCode】No.54. Spiral Matrix -- Java Version

117 阅读1分钟

我正在参加「掘金·启航计划」

题目链接: leetcode.com/problems/sp…

1. 题目介绍(Spiral Matrix)

Given an m x n matrix, return all elements of the matrix in spiral order.

【Translate】: 给定一个m × n矩阵,以螺旋顺序返回该矩阵的所有元素。

【测试用例】:

testcase1

testcase2

【约束】:

在这里插入图片描述

  解题的关键在于遍历方向的改变,方向的变化通过边界判断可以实现,遍历什么时候结束只需要计算遍历的总数即可。与其相关的题目还有两个:No 59. Spiral Matrix IINo 885. Spiral Matrix III.

2. 题解

  原题解来自于GreatLim在 Super Simple and Easy to Understand Solution 中的comment。检查边界非常简单,就是检查res.size () < n * m,然后在循环里向左向下向右向上依次,然后每次一个大循环完毕,就左+、右-、上+、下-。

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new LinkedList<>(); 
        if (matrix == null || matrix.length == 0) return res;
        int n = matrix.length, m = matrix[0].length;
        int up = 0,  down = n - 1;
        int left = 0, right = m - 1;
        while (res.size() < n * m) {
            for (int j = left; j <= right && res.size() < n * m; j++)
                res.add(matrix[up][j]);
            
            for (int i = up + 1; i <= down - 1 && res.size() < n * m; i++)
                res.add(matrix[i][right]);
                     
            for (int j = right; j >= left && res.size() < n * m; j--)
                res.add(matrix[down][j]);
                        
            for (int i = down - 1; i >= up + 1 && res.size() < n * m; i--) 
                res.add(matrix[i][left]);
                
            left++; right--; up++; down--; 
        }
        return res;
    }
}

case