图像顺时针旋转90°——矩阵的旋转

LeetCode图像旋转

题目描述:
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 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]]

示例 3

  输入:matrix = [[1]]
  输出:[[1]]

示例 4:

  输入:matrix = [[1,2],[3,4]]
  输出:[[3,1],[4,2]]

分析:
图像的旋转,也可以看作是对于2维矩阵的操作,可以在建立以一个矩阵,然后使用两次for循环就可以将其旋转,得到想要的旋转图像。这不失位一个简单容易理解的方法,但是多使用矩阵会增加运算的内存。本次使用线性代数中的知识,先将矩阵上下反转,即水平反转,然后在沿着对角线翻转矩阵,也可以达到同样的目的,而且在保证内存的情况下进行。
方法1

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
    //举证顺时针旋转 90 度,首先可以经过两次的不同的旋转。
    int n=matrix[0].size();  //因为规定了nxn所以可以设置一变量即可
    if(matrix.size()<=1) return ;
    ///两次反转,水平反转,即将第一行换到最后一行,第二行换到倒数第二行,以此循环。
    for(int x=0;x<n/2;x++){
        for(int y=0;y<n;y++){
           swap(matrix[x][y],matrix[n-x-1][y]);
            }
    }
    ///沿着对角线反转
     for(int x=0;x<n;x++){
        for(int y=0;y<x;y++){
           swap(matrix[x][y],matrix[y][x]);
            }
    }
    }
};

附加方法2
复制一个同样大小的数组,通过直接旋转方法来进行矩阵旋转,旋转时候通过观察满足。因此对于矩阵中的元素 matrix[x][y],在旋转后,它的新位置为 matrix[y][n - x - 1]。代码如下:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
    int n=matrix[0].size();  //因为规定了nxn所以可以设置一变量即可
    //c++的拷贝,得到一个同样大小的数组,值相同
    auto matrix_new=matrix;
    for(int x=0;x<n;x++){
        for(int y=0;y<n;y++){
            matrix[y][n-x-1]=matrix_new[x][y];
        }
    }
    }
};

记录做题的笔记,希望每天能进步一点!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值