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);
    }
}


总结:

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

目录
相关文章
|
8月前
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
50 0
|
7天前
leetcode54螺旋矩阵题解
leetcode54螺旋矩阵题解
10 2
|
17天前
|
算法 机器人 数据挖掘
LeetCode题目54:螺旋矩阵【python4种算法实现】
LeetCode题目54:螺旋矩阵【python4种算法实现】
|
8月前
|
机器学习/深度学习 算法
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
38 0
|
1月前
leetcode-6111:螺旋矩阵 IV
leetcode-6111:螺旋矩阵 IV
27 0
|
1月前
|
Java C++ Python
leetcode-59:螺旋矩阵 II
leetcode-59:螺旋矩阵 II
24 0
|
1月前
leetcode-54:螺旋矩阵
leetcode-54:螺旋矩阵
26 0
LeetCode刷题Day03——数组(滑动窗口+螺旋矩阵)
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。 滑动窗口也可以理解为双指针法的一种,只不过这种解法更像是一个窗口的移动。 实现滑动窗口,主要确定如下三点:
|
7月前
|
算法
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
44 0
|
12月前
|
算法 安全 Swift
LeetCode - #59 螺旋矩阵 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #59 螺旋矩阵 II