题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
结果
运行时间:3ms
占用内存:480k
知识点
代码
class Solution {
public:
vector<int> printMatrix(vector<vector<int>> matrix) {
int row=matrix.size();//列数(使用时下标-1)
int col=matrix[0].size();//行数
vector<int> result;//栈 vector容器
/* top
array[0][0]=1 array[0][1]=2 array[top][2]=3 array[0][3]=4 array[0][4]=5
left array[left][0]=6 array[1][1]=7 array[1][2]=8 array[1][3]=9 array[1][right-1]=10 right
array[2][0]=11 array[2][1]=12 array[btm][2]=13 array[2][3]=14 array[2][4]=15
btm
*/
/*
每一行或列的输出都会使得下次输出减少一行或一列
如何判断还有项需要输出为重点!!!
剥皮过程::::::::::
第一行判断:无
最后一列判断:首行数<尾行数(有宽度)
最后一行判断:首行数<尾行数 且 首列数<尾列数(有长度,有宽度)
第一列判断:首行数+1<尾行数 且 首列数<位列数(有长度,有宽度) (首行+1 因为引进去了两行了)
*/
int left=0,right=col-1,top=0,btm=row-1;//数组下标从零开始,所以减一
while(left<=right&&top<=btm)//左右 上下 如果没完成
{
for(int i=left;i<=right;i++)//首行 行不变,列++
result.push_back(matrix[top][i]);
if(top<btm)//用行判断是否有列可以输出;;;多余的行数中才能有列
for(int i=top+1;i<=btm;i++)//最右列,列不变,行++
result.push_back(matrix[i][right]);
if(top<btm&&left<right)//有多余的行+多于的列;;才能有最下面的一行输出
for(int i=right-1;i>=left;i--)//最下行,行不变,列--
result.push_back(matrix[btm][i]);
if(top+1<btm&&left<right)//有多余的行+多余的列;;才能有最左边的一列输出,top+1 :: 上边已经输出了一列。
for(int i=btm-1;i>=top+1;i--)//最左列,列不变,行++
result.push_back(matrix[i][left]);
left++;right--;top++;btm--;//
}
return result;
}
};
总结
1)写代码注意判断条件!!!
2)首先找输入输出,判断变与不变(什么时候变)!!!
3)好脑子不如画个图,写写数!!! 何况你有好脑子吗?你有脑子吗?
4)代码变量名称起的好,省去好多!!!多敲几个字母,多定义几个变量不一定是坏事!!!
4)代码相关
二维数组a[M-1][N-1]={M*N},