题目描述
给出一个用二维矩阵表示的图像 ,返回该图像顺时针旋转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]);
}
};