大家好,我是开车的阿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; } };