将矩阵顺时针旋转 90 度而不使用任何额外空间 |设置 3
给定一个有N行M列的矩形矩阵 mat[][] ,任务是在不使用额外空间的情况下顺时针方向旋转矩阵 90 度。
例子:
Input: mat[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}
Output: 10 7 4 1
11 8 5 2
12 9 6 3
Input: mat[][] = {{1, 2, 3, 4, 5, 6}, {7, 8, 9, 10, 11, 12}}
Output: 7 1
8 2
9 3
10 4
11 5
12 6
注意:旋转方阵的方法已经讨论如下:
- 有额外空间:就地旋转方阵 90 度 |设置 1
- 逆时针方向无额外空间:将矩阵旋转 90 度而不使用任何额外空间 | 2套
方法:主要思想是执行就地旋转。
按照以下步骤解决给定的问题:
- 交换子矩阵min(N, M) * min(N, M) 的所有元素,沿着主对角线,即从上角到右下角。
- 如果N大于M ,
- 推每列i其中(分钟(N,M)≤i)至第i行的所有unswapped元素。
- 否则,所有推各行的unswapped元件i其中(分钟(N,M)≤i)与第i列。
- 反转矩阵的每一行
- 打印维度为M × N的更新矩阵。
程序:
让给定的矩阵为:
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
交换子矩阵的所有元素 min(N, M) * min(N, M) 即 3 * 3 对于这个例子
1 4 7
2 5 8
3 6 9
10 11 12
13 14 15
由于N> M,推所有各列I(分钟(N,M)≤i)的unswapped元素到第i行
1 4 7 10 13
2 5 8 11 14
3 6 9 12 15
反转每一列以获得最终的旋转矩阵:
13 10 7 4 1
14 11 8 5 2
15 12 9 6 3
下面是上述方法的实现:
C++
// C++ program for
// the above approach
#include
using namespace std;
// Function to print the matrix mat
// with N rows and M columns
void print(vector > mat,
int N, int M)
{
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cout << mat[i][j] << " ";
}
cout << "\n";
}
}
// Function to rotate the matrix
// by 90 degree clockwise
void rotate(vector > mat)
{
// Number of rows
int N = mat.size();
// Number of columns
int M = mat[0].size();
// Swap all the elements along main diagonal
// in the submatrix min(N, M) * min(N, M)
for (int i = 0; i < min(N, M); i++) {
for (int j = i; j < min(N, M); j++) {
// Swap mat[i][j] and mat[j][i]
swap(mat[i][j], mat[j][i]);
}
}
// If N is greater than M
if (N > M) {
// Push all the unswapped elements
// of ith column to ith row
for (int i = 0; i < M; i++) {
for (int j = min(N, M); j < N; j++) {
mat[i].push_back(mat[j][i]);
}
}
}
else {
// Resize mat to have M rows
mat.resize(M, {});
// Push all the unswapped elements
// of ith column to ith row
for (int i = min(N, M); i < M; i++) {
for (int j = 0; j < N; j++) {
mat[i].push_back(mat[j][i]);
}
}
}
// Reverse each row of the matrix
for (int i = 0; i < M; i++) {
reverse(mat[i].begin(), mat[i].end());
}
// Print the final matrix
print(mat, M, N);
}
// Driver Code
int main()
{
// Input
vector > mat = { { 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 },
{ 10, 11, 12 } };
// Function Call
rotate(mat);
return 0;
}
10 7 4 1
11 8 5 2
12 9 6 3
时间复杂度: O(N * M)
辅助空间: O(1)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。