今天我们来看这道螺旋矩阵,和昨天发的题很类似。没有技巧,全是循环。小白也能懂~
力扣54.螺旋矩阵
题目描述:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 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]
思路:
1、我们可以根据这个例图来定义一下变量,确定该有的左右边界,上下边界。
2、我们还需要一个结果数组来保存矩阵。
3、左边不大于等于右边的时候,上边不大于等于下面才能进行以下四个循环:
从左到右
从上到下
从右到左
从下到上
-》循环的时候要考虑加加减减更新边界值。
-》循环遍历后,根据行列对应的边界值插入到数组中
4、最后返回结果数组
运行代码及注释
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> result; // 定义一个结果数组
int left = 0; // 定义左边界值
int right = matrix[0].size(); // 定义右边界值,因为是矩阵
int top = 0; // 定义矩阵上边界
int bottom = matrix.size(); // 定义矩阵下边界
while (left < right && top < bottom) { // 当条件成立循环持续
// 从左到右遍历
for (int i = left; i < right; i++) {
result.push_back(matrix[top][i]);//matrix[top][i]里的值对应top行 i列
}
++top;//更新top
if (top >= bottom) {
break;//如果top>=bottom证明越界,就结束遍历
}
// 从上到下遍历
for (int j = top; j < bottom; j++) {
result.push_back(matrix[j][right - 1]);//matrix[j][right - 1]j行[right - 1]列
}
--right;//right向前移动
if (left >= right) {
break;如果left >= right证明越界,就结束遍历
}
// 从右到左遍历
for (int k = right - 1; k >= left; --k) {
result.push_back(matrix[bottom - 1][k]);
}
--bottom;
if (top >= bottom) {
break;
}
// 从下到上遍历
for (int l = bottom - 1; l >= top; l--) {
result.push_back(matrix[l][left]);
}
++left;
}
return result;//返回结果数组
}
};
总结
这道题目和昨天的题目是差不多的,要注意边界,并且更新边界,进行循环遍历每行每列数组,不明白边界的可以看看我之前的二分查找还有上一个螺旋矩阵题目呀~希望对你有所帮助!