LeetCode第54题

难度:中等

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

示例1:

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

输出1,2,3,6,9,8,7,4,5

示例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

  • m == matrix.length

  • n == matrixi.length

  • 1 <= m, n <= 10

  • -100 <= matrixij <= 100

问题分析

这题是让顺时针螺旋顺序返回矩阵中的所有元素,我们可以直接模拟,从外到内一圈一圈的打印矩阵中的元素,需要使用4个变量来记录访问的位置,直到全部元素都访问完为止,如下图所示。

这里还要注意上下左右四个方向访问的边界,哪些是开区间哪些是闭区间,代码如下。

JAVA:

复制代码
public List<Integer> spiralOrder(int[][] matrix) {
    List<Integer> ans = new ArrayList<>();
    int n = matrix.length, m = matrix[0].length;
    int up = 0, down = n - 1, left = 0, right = m - 1;
    int total = m * n;// 总的元素个数
    while (ans.size() < total) {
        // 上面,从左往右打印,左闭右闭区间[left,right]
        for (int i = left; i <= right && ans.size() < total; i++)
            ans.add(matrix[up][i]);
        // 右边,从上往下打印,上开下开区间(up,down)
        for (int i = up + 1; i <= down - 1 && ans.size() < total; i++)
            ans.add(matrix[i][right]);
        // 下边,从右往左打印,右闭左闭区间[right,left]
        for (int i = right; i >= left && ans.size() < total; i--)
            ans.add(matrix[down][i]);
        // 左边,从下往上打印,下开上开区间(down,up)
        for (int i = down - 1; i >= up + 1 && ans.size() < total; i--)
            ans.add(matrix[i][left]);
        left++;
        right--;
        up++;
        down--;
    }
    return ans;
}

C++:

复制代码
public:
    vector<int> spiralOrder(vector<vector<int>> &matrix) {
        vector<int> ans;
        int n = matrix.size(), m = matrix[0].size();
        int up = 0, down = n - 1, left = 0, right = m - 1;
        int total = m * n;// 总的元素个数
        while (ans.size() < total) {
            // 上面,从左往右打印,左闭右闭区间[left,right]
            for (int i = left; i <= right && ans.size() < total; i++)
                ans.push_back(matrix[up][i]);
            // 右边,从上往下打印,上开下开区间(up,down)
            for (int i = up + 1; i <= down - 1 && ans.size() < total; i++)
                ans.push_back(matrix[i][right]);
            // 下边,从右往左打印,右闭左闭区间[right,left]
            for (int i = right; i >= left && ans.size() < total; i--)
                ans.push_back(matrix[down][i]);
            // 左边,从下往上打印,下开上开区间(down,up)
            for (int i = down - 1; i >= up + 1 && ans.size() < total; i--)
                ans.push_back(matrix[i][left]);
            left++;
            right--;
            up++;
            down--;
        }
        return ans;
    }

Python:

复制代码
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
    ans = []
    n, m = len(matrix), len(matrix[0])
    up, down, left, right = 0, n - 1, 0, m - 1
    total = m * n  # 总的元素个数
    while len(ans) < total:
        # 上面,从左往右打印,左闭右闭区间[left,right]
        for i in range(left, right + 1):
            ans.append(matrix[up][i])
        # 右边,从上往下打印,上开下闭区间(up,down]
        for i in range(up + 1, down + 1):
            ans.append(matrix[i][right])
        # 上下重叠就终止
        if up == down or left == right: break
        # 下边,从右往左打印,右开左闭区间(right,left]
        for i in range(right - 1, left - 1, -1):
            ans.append(matrix[down][i])
        # 左边,从下往上打印,下开上开区间(down,up)
        for i in range(down - 1, up, -1):
            ans.append(matrix[i][left])
        left += 1
        right -= 1
        up += 1
        down -= 1
    return ans
相关推荐
caimouse12 分钟前
mm学习笔记_04:VAD树算法与地址空间分配
笔记·学习·算法·reactos
abcy07121319 分钟前
flink窗口类型
开发语言·python·算法
什巳11 小时前
JAVA练习309- 二叉树的层序遍历
java·数据结构·算法·leetcode
什巳13 小时前
JAVA练习306- 翻转二叉树
java·数据结构·算法·leetcode
smj2302_7968265213 小时前
解决leetcode第3989题网格中保持一致的最大列数
python·算法·leetcode
巧克力男孩dd15 小时前
Python超典型练习题(第一次作业)
开发语言·python·算法
爱刷碗的苏泓舒15 小时前
平方根信息滤波:矩阵推导及 GNSS 参数估计应用
线性代数·算法·矩阵·gnss·参数估计·测量平差·平方根信息滤波
想做小南娘,发现自己是女生喵16 小时前
第 2 章 顺序表和 vector
java·数据结构·算法
艾醒16 小时前
2026年第29周(7.13-7.19)AI全复盘:技术突破、行业趣闻翻车、算力服务器商业动态
人工智能·算法
雪碧聊技术17 小时前
动态规划算法—01背包问题
算法·动态规划