Leetcode 54:Spiral Matrix 螺旋矩阵

简介: 54:Spiral Matrix 螺旋矩阵Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

54:Spiral Matrix 螺旋矩阵

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

Example 1:

Input:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]

Example 2:

Input:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

解题思路:

​ 参考例二,观察索引改变方式:(0,0)--->(0,3)、(0,3)--->((2,3)--->(2,0)--->(1,0)--->(1,2)

​ 从(0,3)看,分别是:向下 横坐标自增1,到2;向左:纵坐标自减1 ,到0;向上横坐标自减1,到1;向右纵坐标自增1,到2

​ 假如m*n的矩阵,从(0,m-1)开始,向下移动n-1次到达最下面,再向左m-1次,向上n-2次,向右m-2次,接着就是:向下n-3,向左m-3,向上n-4,向右m-4。每次转向m或n都会自减1。

这是我的思路,网上很多都是直接操作索引坐标,我觉得不是很好理解,因为超过一个螺旋的矩阵,每次都要更改参考坐标,不过两种方法本质差别不大

java:

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List nums=new ArrayList();
        if (matrix.length==0||matrix[0].length==0)return nums ;
        int row=matrix.length-1,col=matrix[0].length-1,m=0,n=0,i=-1,tmp=0;

        while (row>=0&&col>=0){
            switch (i++%4){
                case 0:
                    for (tmp=0;tmp<row;tmp++)
                        nums.add(matrix[++m][n]);row-=1;
                    break;
                case 1:
                    for (tmp=0;tmp<col;tmp++)
                        nums.add(matrix[m][--n]);col-=1;
                    break;
                case 2:
                    for (tmp=0;tmp<row;tmp++)
                        nums.add(matrix[--m][n]);row-=1;
                    break;
                case 3:
                    for (tmp=0;tmp<col;tmp++)
                        nums.add(matrix[m][++n]);col-=1;
                    break;
                default:
                    for (tmp=0;tmp<=col;tmp++)
                        nums.add(matrix[m][n++]);tmp=0;n-=1;
                    break;
            }
        }
        return nums;
    }
}

注意点:

​ 先判断是否为空数组,判断条件顺序不能颠倒。因为如果 matrix.length==0 判断为true,则后面的 matrix[0].length==0 不会再判断,即返回空数组;但是matrix[0].length==0 在前时,如果输入数组为空,matrix[0] 会报错因为matrix并没有0号索引。

python3:

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if len(matrix)==0 or len(matrix[0])==0:return []
        nums=[];m=0;n=0;row=len(matrix)-1;col=len(matrix[0])-1;flag=0;
        for n in range(col+1):nums.append(matrix[m][n])
        while row>=0 and col>=0:
            if flag % 4 == 0:
                for i in range(row):
                    m+=1
                    nums.append(matrix[m][n])
                row -= 1
            elif flag % 4==1:
                for i in range(col):
                    n-=1
                    nums.append(matrix[m][n])
                col -= 1
            elif flag % 4 == 2:
                for i in range(row):
                    m-=1
                    nums.append(matrix[m][n])
                row -= 1
            elif flag % 4 == 3:
                for i in range(col):
                    n+=1
                    nums.append(matrix[m][n])
                col -= 1
            flag+=1
        return nums

注意点:

​ python没有switch...case...语句。for循环可操作性很高,可以直接操作索引坐标改变遍历方式,不再赘述。

目录
相关文章
Leetcode 74. Search a 2D Matrix
这道题很简单,为此专门写篇博客其实算博客凑数了。给你一个每一行每一列都是增序,且每一行第一个数都大于上一行末尾数的矩阵,让你判断某个数在这个矩阵中是否存在。 假设矩阵是m*n,扫一遍的时间复杂度就是O(m*n),题目中给出的这么特殊的矩阵,时间复杂度可以降到O(m+n),具体代码如下,写的比较挫。
86 1
Leetcode 240. Search a 2D Matrix II
具体思路就是每一行倒着扫,扫到第一个比target小的数就跳到下行,如果等于当然是直接返回true了,如果下一行还比target小就继续跳下一行,直到最后一行。 为啥这么做是可行的? 可能我比较笨,想了半天才想到。 因为每一列都是增序的,举个例子,假设matrix[0][5] > target,那么[0][5]位置右下(包含右和下)所有元素不可能比target小。
46 0
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
73 0
|
1月前
|
C++
Leetcode第54题(螺旋矩阵)
这篇文章介绍了LeetCode第54题“螺旋矩阵”的解题思路和C++的实现代码,该题目要求按照顺时针螺旋顺序返回给定矩阵中的所有元素。
15 1
Leetcode第54题(螺旋矩阵)
|
1月前
【LeetCode 05】螺旋矩阵II总结
【LeetCode 05】螺旋矩阵II总结
14 0
|
3月前
|
算法
LeetCode第59题螺旋矩阵 II
LeetCode第59题"螺旋矩阵 II"的解题方法,通过模拟螺旋填充过程,一圈一圈从外到内按顺序填充数字,直到完成整个矩阵的构建。
LeetCode第59题螺旋矩阵 II
|
3月前
|
存储 算法
LeetCode第54题螺旋矩阵
LeetCode第54题"螺旋矩阵"的解题方法,通过模拟从外到内的螺旋遍历过程,并利用方向向量控制遍历方向的转换,有效输出矩阵的螺旋顺序。
LeetCode第54题螺旋矩阵
|
机器学习/深度学习 算法
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
57 0
|
5月前
leetcode54螺旋矩阵题解
leetcode54螺旋矩阵题解
33 2
|
5月前
|
算法 机器人 数据挖掘
LeetCode题目54:螺旋矩阵【python4种算法实现】
LeetCode题目54:螺旋矩阵【python4种算法实现】