有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。
给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。
class Transform {
public:
vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
// write code here
vector<vector<int>> temp = mat;
int max = n-1;
for(int i = 0;i < n; i++)
{
for(int j = 0; j < n; j++)
{
temp[j][max] = mat[i][j];
}
max--;
}
return temp;
}
};
vector本来就是可以用来代替一维数组的,vector提供了operator[]函数,可以像数组一样的操作,而且还有边界检查,动态改变大小。
C++的template参数是可以嵌套定义的,你可以这样定义一个模板的Instance
vector<vector<int> > array2(3);//注意>和>之间的空格。
- 1
array2可以保存3个向量,向量的长度是可以改变的。array2[i]返回的是第i个向量。同理,array2[i][j]返回的是第i个向量中的第j个元素。
访问二维vector的元素
下边没有指定向量的大小,也没有去初始化,就访问,程序会segement failed。
vector<vector<int> > array2(3);
array2[1][2]=9;
- 1
- 2
可用push_back函数可以解决问题:
array2[1].push_back(9);
//push_back()添加值为val的元素到当前vector末尾
- 1
只要提前设定好每行vector的大小,就可用operator[]访问,如下:
for(int i=0;i<3;i++)
array2[i].resize(3); //resize() 函数改变当前vector的大小为size,且对新创建的元素赋值val
- 1
- 2
现在,你就定义了一个3X3的数组了(另一个3是在声明时定义的)。而且你可以随时改变它的大小。
下面提供一个范例,供参考。
//在VC下会有变量定义问题,大家自己解决
#include <iostream>
#include <vector>
using namespace std;
void main()
{
vector< vector<int> > array(3);
for(int i=0;i<3;i++)
array[i].resize(3);//设置数组的大小3X3
//现在你可以和使用数组一样使用这个vector
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
array[i][j]=(i*j);
//输出
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
cout<<array[i][j]<<" ";
cout<<endl;
}
array.resize(5);
arry[3].resize(3);
arry[4].resize(3);
//现在是5X3的数组了
for(int i=0;i<5;i++)
for(int j=0;j<3;j++)
array[i][j]=(i*j);
for(int i=0;i<5;i++)
{
for(int j=0;j<3;j++)
cout<<array[i][j]<<" ";
cout<<endl;
}
参考:https://blog.csdn.net/u010186001/article/details/59141786