📌  相关文章
📜  将矩阵顺时针旋转 90 度而不使用任何额外空间 |设置 3

📅  最后修改于: 2022-05-13 01:57:22.306000             🧑  作者: Mango

将矩阵顺时针旋转 90 度而不使用任何额外空间 |设置 3

给定一个有NM列的矩形矩阵 mat[][] ,任务是在不使用额外空间的情况下顺时针方向旋转矩阵 90 度。

例子:

注意:旋转方阵的方法已经讨论如下:



  • 有额外空间:就地旋转方阵 90 度 |设置 1
  • 逆时针方向无额外空间:将矩阵旋转 90 度而不使用任何额外空间 | 2套

方法:主要思想是执行就地旋转。

按照以下步骤解决给定的问题:

  1. 交换子矩阵min(N, M) * min(N, M) 的所有元素,沿着主对角线,即从上角到右下角。
  2. 如果N大于M
    • 推每列i其中(分钟(N,M)≤i)第i行的所有unswapped元素。
    • 否则,所有推各行的unswapped元件i其中(分钟(N,M)≤i)第i列。
  3. 反转矩阵的每一行
  4. 打印维度为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 现场工作专业课程学生竞争性编程现场课程。