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