題目描述
輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字,例如,如果輸入如下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
題目分析
涉及循環輸出矩陣,注意畫出示意圖更容易找到題目的規律。
每環矩陣的輸出都是從下標爲(start,start)開始的,比如一開始的(0,0);循環繼續的條件是matrixRows > start * 2 && matrixCols > start * 2;
打印環的過程分別是從左往右,從上往下,從右往左,從下往上,注意不要重複打印矩陣中的元素,注意不是每個環都包含了四個方向,2*2的環,只有前三個方向;n*1的環,只有前兩個方向;1*n的環,只有第一個方向;四個方向都有的環,起碼是3*2的環。
注意利用vector<vector <int>> matrix表示的輸入數組,行列情況如下:int matRows = matrix.size();int matCols = matrix[0].size();
通過的代碼
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> result;
if(matrix.empty())
return result;
int matRows = matrix.size();
int matCols = matrix[0].size();
if(matCols <= 0 && matRows <= 0)
return result;
int start = 0;
while(matCols > start * 2 && matRows > start * 2)
{
int endx = matRows- 1 - start;
int endy = matCols- 1 - start;
if(start <= endy)
{
for(int i = start; i<=endy; ++i)
{
result.push_back(matrix[start][i]);
}
}
if(start < endx)
{
for(int i=start+1; i<=endx; ++i)
{
result.push_back(matrix[i][endy]);
}
}
if(start < endx && start < endy)
{
for(int i=endy-1; i>=start; --i)
{
result.push_back(matrix[endx][i]);
}
}
if(start < endx-1 && start < endy)
{
for(int i=endx-1; i>start; --i)
{
result.push_back(matrix[i][start]);
}
}
start++;
}
return result;
}
};