【发布时间】:2020-12-10 04:06:04
【问题描述】:
我想将一个以一维向量形式表示的矩阵旋转 90 度。
当它是 2D 时,这就是我所做的工作:
void rotate(vector<vector<int>>& matrix) {
reverse(matrix.begin(), matrix.end());
for (int i = 0; i < matrix.size(); ++i){
for (int j= i + 1; j < matrix[0].size(); ++j) {
swap(matrix[i][j], matrix[j][i]);
}
}
}
当我用一维表示时,例如:
vector<int> matrix = {1, 2, 3, 4, 5, 6, 7, 8, 9};
这是我尝试过的:
void rotate(vector<int>& matrix, const int& n) {
int i = 0, j = 0;
for (i = 0; i < n; ++i) {
for (j = i + 1; j < n; ++j) {
swap(matrix[i + j], matrix[i + j * n]);
}
reverse(matrix.begin() + i * n, matrix.begin() + (i * n) + j);
}
}
结果是:
matrix = {7, 4, 1, 6, 5, 8, 9, 2, 3}
但预期的结果应该是:
matrix = {7, 4, 1, 8, 5, 2, 9, 6, 3}
在索引方面是否有更好的方法或我缺少什么?
【问题讨论】:
-
我不知道 将矩阵旋转 90 度 是什么意思。请详细说明。
-
嗨,Sahu,顺时针旋转 90 度将给出矩阵 m = [[1,2,3],[4,5,6],[7,8,9]],结果 [ [7,4,1],[8,5,2],[9,6,3]],现在给定一维向量中的 m,我想在原地做同样的事情并得到 [7,4,1, 8,5,2, 9,6,3]。谢谢!
-
我猜这里“将矩阵旋转 90 度”的意思是“转置矩阵”
-
就像你说的,在索引方面出了点问题:只需执行 swap(matrix[i * n + j], matrix[i + j * n]) 并删除对 reverse 的调用?还应更改第 j 次迭代的边界并从“i”开始