【LeetCode刷题(简单程度)】剑指 Offer 29. 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 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]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:本题看了剑指offer的书上的思路。首先我们可以发现遍历完一圈,那么矩阵的行和列都少了1,依次类推可以发现,我们每次打印的起点可以认为是从(0,0), (1,1), (2,2), (3,3).....(start,start),再次观察我们可以发现 对于一个n×m的矩阵来讲,只要n > start*2并且m > start*2(注意start是从0开始的),都可以进行下一圈的遍历。

除此之外,在打印末一行或者某一列时,首先想好是否确实需要打印,可以看代码注释的部分。

class Solution {
public:
    vector<int> ans;
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if(matrix.size()==0)
            return ans;
        int rows = matrix.size();
        int columns = matrix[0].size();

        int start = 0;
        while((rows > (start<<1))&&(columns>(start<<1)))
        {
            Print(matrix,rows,columns,start);
            ++start;
        }
        return ans;
    }
    void Print(vector<vector<int>>& matrix,int rows,int columns,int start)
    {
        int endX = columns - 1 - start; //遍历一圈会减少两列
        int endY = rows - 1 - start; //遍历一圈会减少两行

        //从左到右打印一行
        for(int i = start;i<=endX;++i)
        {
            ans.push_back(matrix[start][i]);
        }

        //从上到下打印一列
        if(start < endY)
        {
            for(int i = start + 1;i <= endY;++i)
            {
                ans.push_back(matrix[i][endX]);
            }
        }

        //从右到左打印一行
        if(start < endX&& start < endY)//有这一行 并且确实这一行大于两个元素
        {
            for(int i = endX - 1;i >= start; --i)
            {
                ans.push_back(matrix[endY][i]);
            }
        }
        //从下到上打印一列
        if(start < endY -1 &&start < endX)//有这一列 并且这一列的元素至少有三个
        {
            for(int i = endY - 1;i>start;--i)
            {
                ans.push_back(matrix[i][start]);
            }
        }
    }
};

猜你喜欢

转载自blog.csdn.net/qq_33197518/article/details/108741452