算法刷题

LeetCode刷题-螺旋矩阵

2021-07-22  本文已影响0人  小鲨鱼FF

前言说明

算法学习,日常刷题记录。

题目连接

螺旋矩阵

题目内容

给你一个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:

输入: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]


矩阵2

提示:

m == matrix.length

n == matrix[i].length

1 <= m, n <= 10

-100 <= matrix[i][j] <= 100

分析过程

第一步

定义列表list,保存返回的所有元素。

第二步

定义上指标top,初始为0。

定义下指标bottom,初始为行数减1。

定义左指标left,初始为0。

定义右指标right,初始为列数减1。

第三步

循环,顺时针螺旋也就是向右、向下、向左、向上移动,依次遍历,直到没有元素遍历为止。

第四步

1、向右移动,行不变,列从左到右。

向右移动后,因为接下来要向下移动,所以上指标top加1,如果上指标top大于下指标bottom,结束循环。

2、向下移动,列不变,行从上到下。

向下移动后,因为接下来要向左移动,所以右指标right减1,如果右指标right小于左指标left,结束循环。

3、向左移动,行不变,列从右到左。

向左移动后,因为接下来要向上移动,所以下指标bottom减1,如果下指标bottom小于上指标top,结束循环。

4、向上移动,列不变,行从下到上。

向上移动后,因为接下来要向右移动,所以左指标left加1,如果左指标left大于右指标right,结束循环。

第五步

结束循环后,返回列表list。

解答代码

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        // 定义列表list,保存返回的所有元素
        List<Integer> list = new ArrayList<>();

        // 定义上指标,初始为0
        int top = 0;
        // 定义下指标,初始为行数减1
        int bottom = matrix.length - 1;
        // 定义左指标,初始为0
        int left = 0;
        // 定义右指标,初始为列数减1
        int right = matrix[0].length - 1;

        // 循环,顺时针螺旋也就是向右、向下、向左、向上,依次遍历,直到没有元素遍历为止
        while (true) {
            // 向右移动,行不变,列从左到右
            for (int i = left; i <= right; ++i) {
                list.add(matrix[top][i]);
            }

            // 向右移动后,因为接下来要向下移动,所以上指标加1,如果上指标大于下指标,结束循环
            if (++top > bottom) {
                break;
            }

            // 向下移动,列不变,行从上到下
            for (int i = top; i <= bottom; ++i) {
                list.add(matrix[i][right]);
            }

            // 向下移动后,因为接下来要向左移动,所以右指标减1,如果右指标小于左指标,结束循环
            if (--right < left) {
                break;
            } 

            // 向左移动,行不变,列从右到左
            for (int i = right; i >= left; --i) {
                list.add(matrix[bottom][i]);
            }

            // 向左移动后,因为接下来要向上移动,所以下指标减1,如果下指标小于上指标,结束循环
            if (--bottom < top) {
                break;
            } 

            // 向上移动,列不变,行从下到上
            for (int i = bottom; i >= top; --i) {
                list.add(matrix[i][left]);
            }

            // 向上移动后,因为接下来要向右移动,所以左指标加1,如果左指标大于右指标,结束循环
            if (++left > right) {
                break;
            } 
        }

        // 返回列表list
        return list;
    }
}

提交结果

执行用时0ms,时间击败100.00%的用户,内存消耗36.5MB,空间击败72.30%的用户。

运行结果

原文链接

原文链接:螺旋矩阵

上一篇下一篇

猜你喜欢

热点阅读