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 == matrix[i].length

  • 1 <= m, n <= 10

  • -100 <= matrix[i][j] <= 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
相关推荐
Jiangxl~1 小时前
IP数据云如何为不同行业提供精准IP查询与风险防控解决方案?
网络·网络协议·tcp/ip·算法·ai·ip·安全架构
李伟_Li慢慢1 小时前
wolfram详解山峦算法
前端·算法
counting money2 小时前
prim算法最小生成树(java)
算法
澈2072 小时前
C++面向对象:类与对象核心解析
c++·算法
用户690673881922 小时前
基于无人机的单目测距系统,平均误差仅2.12%
算法
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 141. 环形链表 | C++ 哈希表直觉解法
c++·leetcode·链表
dinl_vin2 小时前
LangChain 系列·(四):RAG 基础——给大模型装上“外脑“
人工智能·算法·langchain
探物 AI2 小时前
【感知·医学分割】当 YOLOv11 杀入医学赛道:先检测后分割的级联架构
算法·yolo·计算机视觉·架构
隔壁大炮2 小时前
Day06-08.CNN概述介绍
人工智能·pytorch·深度学习·算法·计算机视觉·cnn·numpy
白云千载尽3 小时前
前馈与反馈——经典控制理论中的基础概念
人工智能·算法