作者:翟天保Steven
版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處
題目描述:
輸入一個(gè)矩陣,按照從外向里以順時(shí)針的順序依次打印出每一個(gè)數(shù)字,例如,如果輸入如下4 X 4矩陣:
[[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]]
則依次打印出數(shù)字
[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]
數(shù)據(jù)范圍:
0 <= matrix.length <= 100
0 <= matrix[i].length?<= 100
示例:
輸入:
[[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]
解題思路:
本題考察算法場(chǎng)景模擬。兩種解題思路。
1)模擬邊界文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-689464.html
? ? ? ?將矩陣看成多層包裹,先順時(shí)針遍歷最外面一層,再進(jìn)入里面一層繼續(xù)遍歷,直到上下左右邊界交錯(cuò)。
2)螺旋矩陣
? ? ? ?環(huán)帶為一層遍歷,邊界為一層遍歷。邊界遍歷又分為上下左右四個(gè)子部分。以“1+4”的組合遍歷,完成螺旋矩陣。
測(cè)試代碼:
1)模擬邊界
class Solution {
public:
vector<int> printMatrix(vector<vector<int>> matrix) {
vector<int> result;
int size = int(matrix.size());
// 處理矩陣為空的情況
if(size == 0)
return result;
// 左邊界
int left = 0;
// 右邊界
int right = matrix[0].size() - 1;
// 上邊界
int up = 0;
// 下邊界
int down = size - 1;
// 循環(huán)直到邊界交錯(cuò)
while(left <= right && up <= down){
// 上邊界從左到右
for(int i = left; i <= right; i++)
result.push_back(matrix[up][i]);
// 上邊界向下一格,并判斷上下邊界位置是否交錯(cuò)
up++;
if(up > down)
break;
// 右邊界從上到下
for(int i = up; i <= down; i++)
result.push_back(matrix[i][right]);
// 右邊界向左一格,并判斷左右邊界位置是否交錯(cuò)
right--;
if(left > right)
break;
// 下邊界從右到左
for(int i = right; i >= left; i--)
result.push_back(matrix[down][i]);
// 下邊界向上一格,并判斷上下邊界位置是否交錯(cuò)
down--;
if(up > down)
break;
// 左邊界從下到上
for(int i = down; i >= up; i--)
result.push_back(matrix[i][left]);
// 左邊界向右一格,并判斷左右邊界位置是否交錯(cuò)
left++;
if(left > right)
break;
}
return result;
}
};
2)螺旋矩陣文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-689464.html
class Solution {
public:
vector<int> printMatrix(vector<vector<int>> matrix) {
int row = int(matrix.size());
int col = int(matrix[0].size());
// 處理矩陣為空的情況
if(row == 0 || col == 0)
return vector<int>(0);
// 確認(rèn)環(huán)數(shù),環(huán)數(shù)與行列的最小值有關(guān)
int minL = min(row, col);
int ring = minL / 2 + minL % 2;
// 螺旋矩陣遍歷
int count = row * col;
int t = 0;
vector<int> result(count);
for(int k = 0; k < ring; ++k){
// 當(dāng)前環(huán)上邊界遍歷
for(int p = k; p < col - k && t < count; ++p){
result[t++] = matrix[k][p];
}
// 當(dāng)前環(huán)右邊界遍歷
for(int p = k + 1; p < row - k - 1 && t < count; ++p){
result[t++] = matrix[p][col - k - 1];
}
// 當(dāng)前環(huán)下邊界遍歷
for(int p = col - k - 1; p >= k && t < count; --p){
result[t++] = matrix[row - k - 1][p];
}
// 當(dāng)前環(huán)左邊界遍歷
for(int p = row - k - 2; p >= k + 1 && t < count; --p){
result[t++] = matrix[p][k];
}
}
return result;
}
};
到了這里,關(guān)于劍指offer(C++)-JZ29:順時(shí)針打印矩陣(算法-模擬)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!