【剑指offer】顺时针打印矩阵

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

例如:如果输入如下矩阵

 
 
1234
5678
9101112
13141516

则依次打印出数字:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10

分析:做这道题需要我们缜密的逻辑思维,只要我们细心点都是可以做出来的。我的做题思路是首先要确定需要多少趟循环遍历,每一趟遍历是矩阵顺时针遍历一圈(或一行/一列),而每一趟的遍历的起始位置依次是(0,0),(1,1)...确定了每一趟的起始位置及次数,接下来就是写循环体了,顺序依次是从左到右、从上到下、从右到左、从下到上。改变每趟遍历顺序时注意好起始位置就没什么大问题了,程序如下:

vector<int> printMatrix(vector<vector<int> > matrix) {  
	vector<int> res;  
	if(matrix.empty()) return res;  
	int m=matrix.size(),n=matrix[0].size(),t=0,s=m*n,k;  //s是容器数组的元素个数,
	k=min(m,n)-1; //k是遍历的趟数;  
	if(k==0) k=1;  
	while(t<k){  
		int i=t,j=t; //i,j分别是每趟遍历的初始横纵坐标;  
		while(j<n) res.push_back(matrix[i][j++]);  
		if(s==res.size()) break;  
		j--;i++;  
		while(i<m) res.push_back(matrix[i++][j]);  
		if(s==res.size()) break;  
		i--;j--;  
		while(j>=t) res.push_back(matrix[i][j--]);  
		if(s==res.size()) break;  
		j++;i--;  
		while(i>t) res.push_back(matrix[i--][j]);  
		if(s==res.size()) break;  
		t++; n--;m--;  
	}  
	return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值