资讯专栏INFORMATION COLUMN

leetcode54 Spiral Matrix

琛h。 / 2942人阅读

摘要:题目要求按照顺时针方向旋转访问数组中的元素思路一按行遍历,转化为因为不允许跳跃插入,也就是说如果插入的大于的,就会报出。思路二利用顺序插入为了避免类型转化带来的不必要的性能下降,最好直接利用顺序插入,一次遍历数组。

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

For example,
Given the following matrix:

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].

按照顺时针方向旋转访问数组中的元素

思路一:按行遍历,array转化为list

因为List不允许跳跃插入,也就是说如果插入的index大于list的size,就会报出IndexOutOfBoundException。所以这里我打算采取int[]数组先存储值,再用Arrays.asList转化成list。

    public List spiralOrder(int[][] matrix) {
         int row = matrix.length;
         if(row == 0){
             return new ArrayList();
         }
         int column = matrix[0].length;
         Integer[] result = new Integer[row*column];
         
         int prev = -1;
         int tempRow = row;
         int tempColumn = column;
         //按圈遍历
         for(int i = 0 ; tempRow>1&&tempColumn>1 ; i++){
             
             //遍历行
             for(int j = 0 ; j

但是在这个方法中,先利用int[]在转化成List相当影响效率,虽说只需要遍历n/2个数组。

思路二:利用List顺序插入

为了避免类型转化带来的不必要的性能下降,最好直接利用List顺序插入,一次遍历int[][]数组。我们已知,除非特殊情况,每一圈必定都包含以下遍历,顺序的来说,就是从左往右遍历,再从上往下遍历,再从右往左遍历,再从下往上遍历。这时只需要从左往右遍历的下标和从上往下的下标依次记录了就行。
从左往右便利后,colBegin+1。从上往下遍历后,rowEnd-1。这时需要判断是否有往回遍历的需要。从右往左遍历后,colEnd-1。从下往上遍历后,rowBegin+1。
代码如下:

    public List spiralOrder2(int[][] matrix) {
         List res = new ArrayList();
        
        if (matrix.length == 0) {
            return res;
        }
        
        int rowBegin = 0;
        int rowEnd = matrix.length-1;
        int colBegin = 0;
        int colEnd = matrix[0].length - 1;
        
        while (rowBegin <= rowEnd && colBegin <= colEnd) {
            // Traverse Right
            for (int j = colBegin; j <= colEnd; j ++) {
                res.add(matrix[rowBegin][j]);
            }
            rowBegin++;
            
            // Traverse Down
            for (int j = rowBegin; j <= rowEnd; j ++) {
                res.add(matrix[j][colEnd]);
            }
            colEnd--;
            
            if (rowBegin <= rowEnd) {
                // Traverse Left
                for (int j = colEnd; j >= colBegin; j --) {
                    res.add(matrix[rowEnd][j]);
                }
            }
            rowEnd--;
            
            if (colBegin <= colEnd) {
                // Traver Up
                for (int j = rowEnd; j >= rowBegin; j --) {
                    res.add(matrix[j][colBegin]);
                }
            }
            colBegin ++;
        }
        
        return res;
     }


想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70124.html

相关文章

  • LeetCode[54] Spiral Matrix

    摘要:复杂度思路注意循环条件。代码注意循环条件,要用而不是除以,因为精度准换问题只有一行或者一列的时候,就不要再继续搜索了 LeetCode[54] Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. Fo...

    YFan 评论0 收藏0
  • 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 i...

    venmos 评论0 收藏0
  • 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 i...

    mochixuan 评论0 收藏0
  • leetcode59 Spiral Matrix II

    摘要:题目要求也就是将递加的数字按照顺时针的顺序依次填入数组之中这道题目联系到,其实就相当好解决了。 题目要求 Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example, Given n = 3, You should return...

    QLQ 评论0 收藏0
  • [Leetcode] Spiral Matrix 螺旋矩阵

    摘要:代码添加该圈第一行添加最后一列添加最后一行添加第一列如果是奇数,加上中间那个点后续如果在中,给出的是和来代表行数和列数,该如何解决和的本质区别就是一个是任意长方形,一个是正方形,所以中不需要判断最后一行或者最后一列。 Spiral Matrix I Given a matrix of m x n elements (m rows, n columns), return all ele...

    waruqi 评论0 收藏0

发表评论

0条评论

琛h。

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<