【矩阵】54. 螺旋矩阵【中等】

螺旋矩阵

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

示例 1:

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

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

解题思路

  • 1、模拟顺时针螺旋顺序遍历矩阵的过程。
  • 2、使用四个变量表示当前的上下左右边界,初始化为矩阵的边界。
  • 3、按照顺时针螺旋顺序遍历矩阵,依次沿着上、右、下、左四个方向遍历。
  • 4、每次遍历完成一个方向后,更新对应的边界,并判断是否需要继续遍历。

java实现

bash 复制代码
public class SpiralMatrix {
    public static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new ArrayList<>();
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return result;
        }

        int rows = matrix.length;
        int cols = matrix[0].length;

        int top = 0, bottom = rows - 1, left = 0, right = cols - 1;
        //保证旋转区域是合法的且不会越界。
        // 如果这两个条件不满足,说明已经遍历完了所有的行或列
        while (top <= bottom && left <= right) {
            // 遍历上边界
            for (int j = left; j <= right; j++) {
                result.add(matrix[top][j]);
            }
            top++;

            // 遍历右边界
            for (int i = top; i <= bottom; i++) {
                result.add(matrix[i][right]);
            }
            right--;

            // 检查是否还有下边界
            if (top <= bottom) {
                // 遍历下边界
                for (int j = right; j >= left; j--) {
                    result.add(matrix[bottom][j]);
                }
                bottom--;
            }

            // 检查是否还有左边界
            if (left <= right) {
                // 遍历左边界
                for (int i = bottom; i >= top; i--) {
                    result.add(matrix[i][left]);
                }
                left++;
            }
        }

        return result;
    }

    public static void main(String[] args) {
        int[][] matrix = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };
        int[][] test = {
                { 1,  2,  3,  4},
                { 5,  6,  7,  8},
                { 9, 10, 11, 12},
                {13, 14, 15, 16}
        };
        List<Integer> result = spiralOrder(matrix);
        System.out.println("顺时针螺旋顺序遍历结果: " + result);
        List<Integer> result2 = spiralOrder(test);
        System.out.println("顺时针螺旋顺序遍历结果: " + result2);
    }
}

时间空间复杂度

时间复杂度:O(m * n),其中 m 和 n 分别是矩阵的行数和列数

空间复杂度:O(1),只需要使用常数级别的额外空间

相关推荐
星期天要睡觉4 分钟前
机器学习——支持向量机(SVM)实战案例
笔记·算法·支持向量机
Skylar_.1 小时前
嵌入式 - 数据结构:哈希表和排序与查找算法
数据结构·算法·嵌入式·哈希算法·散列表
破刺不会编程1 小时前
linux信号量和日志
java·linux·运维·前端·算法
黑色的山岗在沉睡3 小时前
【无标题】
数据结构·c++·算法·图论
2301_785038183 小时前
c++初学day1(类比C语言进行举例,具体原理等到学到更深层的东西再进行解析)
c语言·c++·算法
星期天要睡觉5 小时前
机器学习——支持向量机(SVM)
算法·机器学习·支持向量机·svm
已读不回1435 小时前
LRU算法在前端性能优化中的实践艺术(缓存请求函数为例)
javascript·算法
大熊背5 小时前
基于人眼视觉特性的相关图像增强基础知识介绍
人工智能·算法·计算机视觉
啊阿狸不会拉杆6 小时前
《算法导论》第 12 章 - 二叉搜索树
数据结构·c++·算法·排序算法
范特西_6 小时前
不同的子序列-二维动态规划
算法·动态规划