大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点:矩阵遍历、模拟算法。
题目解答方法:
首先定义四个边界变量:top、bottom、left、right,分别表示当前遍历的上、下、左、右边界位置。
初始时,上边界top为0,下边界bottom为矩阵的行数减1,左边界left为0,右边界right为矩阵的列数减1。
定义一个方向变量direction,初始值为0,表示向下遍历。
使用一个循环,判断条件为上边界小于等于下边界且左边界小于等于右边界,表示仍然存在未遍历的元素。
根据当前的方向direction,分别从上到下、从右到左、从下到上、从左到右遍历矩阵的边界,并将遍历到的元素添加到结果序列中。
每次遍历完一个边界后,更新对应的边界和方向:
如果是向下遍历,则上边界top加1;
如果是向左遍历,则右边界right减1;
如果是向上遍历,则下边界bottom减1;
如果是向右遍历,则左边界left加1。
每次遍历完一个边界后,将方向direction加1取余4,以便下一次按照逆时针的方向遍历。
最后返回结果序列。
下面给出使用C++实现的完整代码:
#include <vector>
using namespace std;
class Solution {
public:
vector<int> spiralTravelCounterClockwise(vector<vector<int> >& matrix) {
vector<int> result;
int m = matrix.size();
int n = matrix[0].size();
int top = 0, bottom = m - 1, left = 0, right = n - 1;
int direction = 0;
while (top <= bottom && left <= right) {
if (direction == 0) {
for (int i = top; i <= bottom; i++) {
result.push_back(matrix[i][left]);
}
left++;
} else if (direction == 1) {
for (int i = left; i <= right; i++) {
result.push_back(matrix[bottom][i]);
}
bottom--;
} else if (direction == 2) {
for (int i = bottom; i >= top; i--) {
result.push_back(matrix[i][right]);
}
right--;
} else if (direction == 3) {
for (int i = right; i >= left; i--) {
result.push_back(matrix[top][i]);
}
top++;
}
direction = (direction + 1) % 4;
}
return result;
}
};

京公网安备 11010502036488号