大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

这道题考察的知识点是矩阵操作和数组的索引运算。

思考过程:

给定一个 n × n 的二维矩阵,要求将其逆时针旋转90度,且要直接修改原始矩阵。

我们可以观察到,逆时针旋转90度后,矩阵中第 i 行的元素会变成旋转后矩阵的第 n-i-1 列的元素,即原始矩阵中的 matrix[i][j] 会变成旋转后矩阵的 matrix[j][n-i-1]。

为了不使用额外的空间,我们可以进行原地交换。具体步骤如下:

遍历矩阵的上半部分(行索引范围:0 到 n/2-1,列索引范围:0 到 (n+1)/2-1)。

对于当前元素 matrix[i][j],进行四个元素的交换:

将 matrix[i][j] 的值保存在临时变量 temp 中。

将 matrix[j][n-i-1] 的值赋给 matrix[i][j]。

将 matrix[n-i-1][n-j-1] 的值赋给 matrix[j][n-i-1]。

将 matrix[n-j-1][i] 的值赋给 matrix[n-i-1][n-j-1]。

将 temp 的值赋给 matrix[n-j-1][i]。

完成上述交换后,矩阵即完成了逆时针旋转90度的操作。

原始矩阵:         旋转后矩阵:
a b c d e       e j o t y
f g h i j       d i n s x
k l m n o  ->   c h m r w
p q r s t       b g l q v
u v w x y       a f k p u

在代码实现中,我们使用两个嵌套的循环来遍历上半部分的矩阵元素,并进行交换操作。每次交换涉及四个位置的元素,最终完成逆时针旋转90度的操作。这里使用的编程语言是C++。

#include <vector>

class Solution {
public:
    vector<vector<int>> rotatePastureCounterClockwise(vector<vector<int>>& matrix) {
        int n = matrix.size();

        for (int i = 0; i < n / 2; i++) {
            for (int j = 0; j < (n + 1) / 2; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][n - i - 1];
                matrix[j][n - i - 1] = matrix[n - i - 1][n - j - 1];
                matrix[n - i - 1][n - j - 1] = matrix[n - j - 1][i];
                matrix[n - j - 1][i] = temp;
            }
        }

        return matrix;
    }
};