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

    科技2022-07-10  165

    题目描述

    给出一个用二维矩阵表示的图像 ,返回该图像顺时针旋转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的区别

    reserve表示容器预留空间,但并不是真正的创建对象,需要通过insert()或push_back()等创建对象;resize既分配了空间,也创建了对象。reserve只修改capacity大小,不修改size大小;resize既修改capacity大小,也修改size大小。两者的形参个数不一样。 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]); } };
    Processed: 0.018, SQL: 8