美文网首页
【2020-11-17】 |探索卡片| 二维数组

【2020-11-17】 |探索卡片| 二维数组

作者: EthynylRadical | 来源:发表于2020-11-17 21:57 被阅读0次

    旋转矩阵

    给你一幅由N × N矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
    不占用额外内存空间能否做到?

    示例 1:

    给定 matrix =
    [
    [1,2,3],
    [4,5,6],
    [7,8,9]
    ],

    原地旋转输入矩阵,使其变为:
    [
    [7,4,1],
    [8,5,2],
    [9,6,3]
    ]

    示例 2:

    给定 matrix =
    [
    [ 5, 1, 9,11],
    [ 2, 4, 8,10],
    [13, 3, 6, 7],
    [15,14,12,16]
    ],

    原地旋转输入矩阵,使其变为:
    [
    [15,13, 2, 5],
    [14, 3, 4, 1],
    [12, 6, 8, 9],
    [16, 7,10,11]
    ]

    作者:力扣 (LeetCode)
    链接:https://leetcode-cn.com/leetbook/read/array-and-string/clpgd/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    思路

    旋转关系的求解是这个题的重中之重,一开始我一直在尝试画几个矩阵找规律找感觉,效率未免有点低。
    从平面几何的角度,旋转后的两个向量内积为0,可以以矩阵中心为原点建立正交坐标系,用内积寻找旋转前后的坐标关系,再将坐标关系换算为索引下标的关系。同时讨论矩阵维数分别为奇数和偶数的两种情况。

    class Solution {
    public:
        void rotate(vector<vector<int>>& matrix) {
            int n = matrix.size();
            if(n == 0) { return; }
            int r = (n>>1)-1; //左上角区域的最大行下标,
            int c = (n-1)>>1; //左上角区域的最大列下标,行列下标从 0 开始。
            for(int i = r; i >= 0; --i) {
                for(int j = c; j >= 0; --j) {
                    swap(matrix[i][j], matrix[j][n-i-1]);
                    swap(matrix[i][j], matrix[n-i-1][n-j-1]);
                    swap(matrix[i][j], matrix[n-j-1][i]);
                }
            }
        }
    };
    
    作者:Time-Limit
    链接:https://leetcode-cn.com/problems/rotate-matrix-lcci/solution/c-tu-jie-yuan-di-cao-zuo-ji-bai-shuang-bai-vv-by-t/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    还有一种思路是用两次翻转等效一次旋转,按中垂线翻转一次之后再按/对角线翻转也能实现题目要求的效果。

    相关文章

      网友评论

          本文标题:【2020-11-17】 |探索卡片| 二维数组

          本文链接:https://www.haomeiwen.com/subject/bqefiktx.html