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

思路:

模拟矩阵的顺时针螺旋,用一个变量来记录矩阵含有的元素个数,然后在模拟的过程中,每模拟一个方格,就让该变量--,以该变量是否大于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)*/

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值