leetcode:54.螺旋矩阵

简介: 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

题目描述:


给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。


示例1:


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


示例2:


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


题目难度:中等


分析:


可以把整个二维数组看作一个平面,不管是顺时针还是逆时针,都可以看作有一个方向,然后顺着这个方向去读取元素即可。比如:首先从第一行往右读取,那么此时的方向就是right,当往右没有元素时,就只能往下,然后此时的方向就是down,以此类推即可读取所有的元素。


代码如下:


class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        Set<String> set = new HashSet<>();
        helpMethod(res, set, matrix, 0, 0, 'r');
        return res;
    }
    /**
     * @param res 最终结果
     * @param set 临时存储结果,用来判断此位置是否走过
     * @param matrix 二维数组
     * @param x 横坐标
     * @param y 纵坐标
     * @param ori 方向
     */
    private void helpMethod(List<Integer> res, Set<String> set, int[][] matrix, int x, int y, char ori) {
        if (matrix.length == 0) {
            return;
        }
        int m = matrix.length, n = matrix[0].length;
        // 递归结束的条件
        if (res.size() == m * n) return;
        res.add(matrix[x][y]);
        // 走过的位置加入Set集合中
        set.add(x +","+ y);
        // 判断此时的方向
        if (ori == 'r') {
          // 判断是否走到头
            if (y == n - 1) {
                ori = 'd';
                x++;
            } else {
                y++;
            }
            // 判断此位置是否走过
            if (set.contains(x + "," + y)) {
                ori = 'd';
                x++;
                y--;
            }
        } else if (ori == 'd') {
            if (x == m - 1) {
                ori = 'l';
                y--;
            } else {
                x++;
            }
            if (set.contains(x + "," + y)) {
                ori = 'l';
                x--;
                y--;
            }
        } else if (ori == 'l') {
            if (y == 0) {
                ori = 'u';
                x--;
            } else {
                y--;
            }
            if (set.contains(x + "," + y)) {
                ori = 'u';
                x--;
                y++;
            }
        } else if (ori == 'u') {
            if (x == 0) {
                ori = 'r';
                y++;
            } else {
                x--;
            }
            if (set.contains(x + "," + y)) {
                x++;
                ori = 'r';
                y++;
            }
        }
        helpMethod(res, set, matrix, x, y, ori);
    }
}


总结:

可以利用递归简化代码的书写,然后根据不同的方向处理不同的逻辑即可。

目录
相关文章
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
73 0
|
1月前
|
C++
Leetcode第54题(螺旋矩阵)
这篇文章介绍了LeetCode第54题“螺旋矩阵”的解题思路和C++的实现代码,该题目要求按照顺时针螺旋顺序返回给定矩阵中的所有元素。
14 1
Leetcode第54题(螺旋矩阵)
|
1月前
【LeetCode 05】螺旋矩阵II总结
【LeetCode 05】螺旋矩阵II总结
14 0
|
3月前
|
算法
LeetCode第59题螺旋矩阵 II
LeetCode第59题"螺旋矩阵 II"的解题方法,通过模拟螺旋填充过程,一圈一圈从外到内按顺序填充数字,直到完成整个矩阵的构建。
LeetCode第59题螺旋矩阵 II
|
3月前
|
存储 算法
LeetCode第54题螺旋矩阵
LeetCode第54题"螺旋矩阵"的解题方法,通过模拟从外到内的螺旋遍历过程,并利用方向向量控制遍历方向的转换,有效输出矩阵的螺旋顺序。
LeetCode第54题螺旋矩阵
|
机器学习/深度学习 算法
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
56 0
|
5月前
leetcode54螺旋矩阵题解
leetcode54螺旋矩阵题解
31 2
|
5月前
|
算法 机器人 数据挖掘
LeetCode题目54:螺旋矩阵【python4种算法实现】
LeetCode题目54:螺旋矩阵【python4种算法实现】
|
5月前
|
存储 算法
力扣经典150题第三十五题:螺旋矩阵
力扣经典150题第三十五题:螺旋矩阵
20 0
|
6月前
leetcode-6111:螺旋矩阵 IV
leetcode-6111:螺旋矩阵 IV
45 0