leetcode_48_Rotate Image

Rotate Image

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up:

Could you do this in-place?

分析:

首先想到,纯模拟,从外到内一圈一圈的转,但这个方法太慢。

方法一:先沿主对角线反转,再沿垂直中线反转。

方法二:首先沿着副对角线翻转一次,然后沿着水平中线翻转一次。(如图所示)

方法三:首先沿着水平中线翻转一次,然后沿着主对角线翻转一次。

举个反例:先水平中线翻转,再斜对角线翻转;在3*3时则错误。

//方法一:先沿主对角线反转,再沿垂直中线反转。时间复杂度 O(n^2),空间复杂度 O(1)
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix[0].size();

        for(int i = 0; i < n; i++) //沿主对角线反转
            for(int j = i + 1; j < n; j++)  //j=i,也可以
                swap(matrix[i][j], matrix[j][i]);

        for(int i = 0; i < n; i++) //沿垂直中线反转
            for(int j = 0; j < n / 2; j++)
                swap(matrix[i][j], matrix[i][n - 1 - j]);
    }
};
//方法二:首先沿着副对角线翻转一次,然后沿着水平中线翻转一次。时间复杂度 O(n^2),空间复杂度 O(1)
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix[0].size();

        for(int i = 0; i < n; i++) //沿副对角线反转
            for(int j = 0; j < n - i - 1; j++)  //j < n - i,也可以
                swap(matrix[i][j], matrix[n - 1 - j][n - 1 - i]);

        for(int i = 0; i < n/2; i++) //沿水平中线反转
            for(int j = 0; j < n; j++)
                swap(matrix[i][j], matrix[n - 1 - i][j]);
    }
};
//方法三:首先沿着水平中线翻转一次,然后沿着主对角线翻转一次。时间复杂度 O(n^2),空间复杂度 O(1)
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix[0].size();

        for(int i = 0; i < n/2; i++) //沿水平中线反转
            for(int j = 0; j < n; j++)
                swap(matrix[i][j], matrix[n - 1 - i][j]);

        for(int i = 0; i < n; i++) //沿主对角线反转
            for(int j = i + 1; j < n; j++) //j=i,也可以
                swap(matrix[i][j], matrix[j][i]);
    }
};

时间: 2024-10-04 00:25:16

leetcode_48_Rotate Image的相关文章