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