力扣 剑指offer29.顺时针打印矩阵

  • Post author:
  • Post category:其他



思路:

模拟矩阵的顺时针螺旋,用一个变量来记录矩阵含有的元素个数,然后在模拟的过程中,每模拟一个方格,就让该变量–,以该变量是否大于0来作为螺旋循环的条件,



模拟顺时针画矩阵的过程:


  • 填充上行从左到右

  • 填充右列从上到下

  • 填充下行从右到左

  • 填充左列从下到上



由外向内一圈一圈这么画下去。

代码:

	class Solution {
	public:
	    vector<int> spiralOrder(vector<vector<int>>& matrix) {
	        vector<int>res;//结果集,用来存矩阵中所有元素
	        if(matrix.size()==0) return res;
	        int left = 0;//每次循环一行的起始位置初始化为0
	        int right = matrix[0].size()-1;//每次循环行的结束位置
	        int top = 0;//每次循环一列的起始位置初始值为0
	        int bottom = matrix.size()-1;//每次循环的结束位置
	        int temp = matrix.size() * matrix[0].size();//矩阵中元素的总个数
	        while(temp >= 1){
	            //四个for循环模拟转一圈,循环条件中要加上temp>=1这个条件,
	            //模拟遍历上行从左到右
	            for(int i = left;i <= right && temp >= 1;i++){
	                res.push_back(matrix[top][i]);
	                temp--;
	            }
	            top++;//遍历完一行后,top边界下移,即top++,右列遍历的起始为top
	            //模拟遍历右列从上到下
	            for(int j = top;j <= bottom && temp >= 1;j++){
	                res.push_back(matrix[j][right]);
	                temp--;
	            }
	            right--;//遍历完右列后,right边界左移,right--
	             //模拟遍历下行从右到左
	            for(int i=right; i >= left && temp >= 1; i--){
	                res.push_back(matrix[bottom][i]);
	                temp--;
	            }
	            bottom--;
	             //模拟遍历左列从下到上
	            for(int j=bottom; j >= top && temp >= 1; j--){
	                res.push_back(matrix[j][left]);
	                temp--;
	            }
	            left++;
	        }
	        return res;
	    }
};

/*时间复杂度:O(mn)
  空间复杂度:O(mn)*/



版权声明:本文为qq_45823984原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。