LeetCode 48. Rotate Image

来源:互联网 发布:阿里云cdn价格 编辑:程序博客网 时间:2024/04/29 07:51

1. 题目描述

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?

2. 解题思路

拿到这个问题, 感觉和 LeetCode 54/59. Spiral Matrix i, ii非常的类似, 我们可以每次旋转一个外围环上的4个点, 直到所有的点都旋转完毕即可

3. code

class Solution {public:    void rotate(vector<vector<int>>& matrix) {        int N = matrix.size();        for (int i = 0; i != N / 2; i++){            rotate_round(matrix, i, N);        }    }private:    void rotate_round(vector<vector<int>>& matrix, int offset, int N){        int len = N - 2 * offset;        for (int i = 0; i != len - 1; i++){            int tmp = matrix[offset][offset + i];            matrix[offset][offset + i] = matrix[N - offset - i - 1][offset];            matrix[N - offset - i - 1][offset] = matrix[N - offset - 1][N - offset - i - 1];            matrix[N - offset - 1][N - offset - i - 1] = matrix[offset + i][N - offset - 1];            matrix[offset + i][N - offset - 1] = tmp;        }    }};

4. 大神解法

4.1 demo1 一个巧妙的数学矩阵变换方法

/* * clockwise rotate * first reverse up to down, then swap the symmetry  * 1 2 3     7 8 9     7 4 1 * 4 5 6  => 4 5 6  => 8 5 2 * 7 8 9     1 2 3     9 6 3*/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[i].size(); ++j)            swap(matrix[i][j], matrix[j][i]);    }}/* * anticlockwise rotate * first reverse left to right, then swap the symmetry * 1 2 3     3 2 1     3 6 9 * 4 5 6  => 6 5 4  => 2 5 8 * 7 8 9     9 8 7     1 4 7*/void anti_rotate(vector<vector<int> > &matrix) {    for (auto vi : matrix) reverse(vi.begin(), vi.end());    for (int i = 0; i < matrix.size(); ++i) {        for (int j = i + 1; j < matrix[i].size(); ++j)            swap(matrix[i][j], matrix[j][i]);    }}
0 0
原创粉丝点击