输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100文章来源:https://www.toymoban.com/news/detail-608160.html
思路:首先自己在33和44的数组中尝试螺旋遍历,会发现规律。
当向右遍历时,其实是从上到下遍历行。rowBegin -》 rowEnd
当向下遍历时,其实是从右到左遍历列。colEnd -》 colBegin
当向左遍历时,其实是从下到上遍历行。rowEnd -》 rowBegin
当向上遍历时,其实是从左到右遍历列。 colBegin -》 colEnd
文章来源地址https://www.toymoban.com/news/detail-608160.html
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> result; // 存储结果的向量
if (matrix.empty()) // 如果矩阵为空,直接返回结果向量
return result;
// 定义边界变量
int rowBegin = 0; // 行的起始位置
int colBegin = 0; // 列的起始位置
int rowEnd = matrix.size() - 1; // 行的结束位置
int colEnd = matrix[0].size() - 1; // 列的结束位置
// 不断缩小边界进行遍历,直到边界重合或交错
while(rowBegin <= rowEnd && colBegin <= colEnd) {
// 从左到右遍历当前行
for (int i = colBegin; i <= colEnd; i++) {
result.push_back(matrix[rowBegin][i]); // 将当前元素添加到结果向量
}
rowBegin++; // 增加起始行索引,排除已遍历的行
// 从上到下遍历当前列
for (int i = rowBegin; i <= rowEnd; i++) {
result.push_back(matrix[i][colEnd]); // 将当前元素添加到结果向量
}
colEnd--; // 减少结束列索引,排除已遍历的列
// 从右到左遍历当前行
if (rowBegin <= rowEnd) { // 检查是否还有剩余的行未遍历
for (int i = colEnd; i >= colBegin; i--) {
result.push_back(matrix[rowEnd][i]); // 将当前元素添加到结果向量
}
rowEnd--; // 减少结束行索引,排除已遍历的行
}
// 从下到上遍历当前列
if (colBegin <= colEnd) { // 检查是否还有剩余的列未遍历
for (int i = rowEnd; i >= rowBegin; i--) {
result.push_back(matrix[i][colBegin]); // 将当前元素添加到结果向量
}
colBegin++; // 增加起始列索引,排除已遍历的列
}
}
return result; // 返回结果向量
}
};
到了这里,关于剑指 Offer 29. 顺时针打印矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!