美文网首页
Leetcode 54. 螺旋矩阵

Leetcode 54. 螺旋矩阵

作者: 尹学姐 | 来源:发表于2023-04-09 13:29 被阅读0次

题目要求

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

image.png

示例2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

解题思路

直接使用模拟法。

定义四个指针,分别指向需要遍历的左、右、上、下边界。

在这四个边界范围内遍历,每次遍历完缩小边界。遍历的方法:

  • 先遍历第一行,缩小上边界
  • 再遍历最后一列,缩小右边界
  • 遍历最后一行,缩小下边界
  • 遍历第一列,缩小左边界

Java代码

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        int n = matrix.length, m = matrix[0].length;
        int l = 0, r = m-1, t = 0, b = n-1;
        while(l <= r && t <= b){
            for(int i = l; i <= r; i++){
                res.add(matrix[t][i]);
            }
            t++;
            // 防止重复遍历
            if(t > b) break;
            for(int i = t; i <= b; i++){
                res.add(matrix[i][r]);
            }
            r--;
            // 防止重复遍历
            if(r < l) break;
            for(int i = r; i >= l; i--){
                res.add(matrix[b][i]);
            }
            b--;
            for(int i = b; i >= t; i--){
                res.add(matrix[i][l]);
            }
            l++;
        }
        return res;
    }
}

总结

这道题就是简单的模拟法。要注意四个边界的范围变化,以及最后几个元素的遍历,要提前break,防止重复遍历。

这道题在面试中还挺常见的,需要熟练掌握写法,防止面试的时候出现细节错误。

相关文章

网友评论

      本文标题:Leetcode 54. 螺旋矩阵

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