LeetCode102:旋转图像(给出一个用二维矩阵表示的图像 返回该图像顺时针旋转90度的结果)

题目描述

给出一个用二维矩阵表示的图像 ,返回该图像顺时针旋转90度的结果

方法一:使用辅助空间

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        //空二维矩阵的处理
        if(matrix.empty())
            return ;
        //定义辅助空间
        vector<vector<int> > tmp=matrix;
        int row=matrix.size(),col=matrix[0].size();
        int maxnum=max(row,col);
        matrix.resize(maxnum);
        for(int i=0;i<maxnum;i++){
            matrix[i].resize(maxnum);
        }
        //旋转
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                matrix[i][j]=tmp[row-j-1][i];
            }
        }
        //去除额外空间
        matrix.resize(col);
        for(int i=0;i<col;i++){
            matrix[i].resize(row);
        }
    }
};

补充:

  • resize()的作用是改变vector中元素的数目。
  • 如果n比当前的vector元素数目要小,vector的容量要缩减到resize的第一个参数大小,既n,并移除那些超出n的元素同时销毁他们。
  • 如果n比当前vector元素数目要大,在vector的末尾扩展需要的元素数目,如果第二个参数val指定了,扩展的新元素初始化为val的副本,否则按类型默认初始化。
  • 注意:如果n大于当前的vector的容量(是容量,并非vector的size),将会引起自动内存分配。所以现有的pointer,references,iterators将会失效。

capacity
指容器在分配新的存储空间之前能存储的元素总数。

size
指当前容器所存储的元素个数

resize和reserve的区别

  1. reserve表示容器预留空间,但并不是真正的创建对象,需要通过insert()或push_back()等创建对象;resize既分配了空间,也创建了对象。
  2. reserve只修改capacity大小,不修改size大小;resize既修改capacity大小,也修改size大小。
  3. 两者的形参个数不一样。 resize带两个参数,一个表示容器大小,一个表示初始值(默认为0);reserve只带一个参数,表示容器预留的大小。

方法二:当矩阵是方阵的时候,使用原地算法解决这个问题

思路分析:
在这里插入图片描述

//做两次翻转,先沿右上-左下的对角线翻转,再沿水平中线上下翻转
class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        //对角线翻转
        const int n = matrix.size();
        for (int i = 0; i < n; i++) 
            for (int j = 0; j < n - i; j++)
            	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]);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值