zoukankan      html  css  js  c++  java
  • Spiral Matrix

    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].

    解析:这道题没有什么太过复杂的数据结构的思想,就是顺时针打印矩阵。我们来分析循环结束条件。假设这个矩阵的的行数rows,列数是columns。打印第一圈的左上角的坐标(1,1),第二圈的左上角的坐标是(2,2),以此类推。我们注意到,左上角的坐标中行标和列标总是相同的,浴室可以在矩阵中选取左上角为(start,start)的一圈作为我们分析的目标。对于一个5*5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2,2)。我们发现5>2*2。对于一个6*6的矩阵而言,最后一圈有4个数字,其左上角坐标仍为(2*2).我们发现6>2*2依然成立。我们可以得出,让循环继续的条件是columns>startX*2并且rows>startY*2。不过注意几种特殊情况,最后一圈可能退化成只有一行、只有一列,甚至只有一个数字.

    class Solution {
    public:
        void printSpiralOrder(vector<vector<int> > &matrix,int start,int columns,int rows,vector<int> &result)
        {
            //int rows=matrix.size();
            //int columns=matrix[0].size();
            int endX=columns-1-start;//
            int endY=rows-1-start;////from left to rigth
            for(int i=start;i<=endX;++i)
            {
                result.push_back(matrix[start][i]);
            }
            //from top to bottom
            if(start<endY)
            {
                for(int i=start+1;i<=endY;++i)
                {
                    result.push_back(matrix[i][endX]);
                }
            }
            //from right to left
            if(start<endX && start<endY)
            {
                for(int i=endX-1;i>=start;--i)
                {
                    result.push_back(matrix[endY][i]);
                }
            }
            //from bottom to top
            if(start<endX && start<endY-1)
            {
                for(int i=endY-1;i>=start+1;--i)
                {
                    result.push_back(matrix[i][start]);
                }
            }
        }
        vector<int> spiralOrder(vector<vector<int> > &matrix) {
            vector<int> result;
            result.clear();
            int rows=matrix.size();
            if(rows<1)
                return result;
            int columns=matrix[0].size();
            int start=0;
            while(columns>start*2 && rows>start*2)
            {
                printSpiralOrder(matrix,start,columns,rows,result);
                ++start;
            }
            return result;
        }
    };
  • 相关阅读:
    Java线程的5个使用技巧
    每个Java程序员需要了解的8个Java开发工具
    爱上Java和JVM的10大理由
    Git入门
    建网站的流程
    idea快捷键
    idea中ctrl+alt+方向键问题
    oracle数据库-备份
    rabbitmq路由模式、订阅、主题
    rabbitmq 工作模式、简单模式
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3647614.html
Copyright © 2011-2022 走看看