题目:
给你一个大小为 m x n 的整数矩阵 grid ,其中 m 和 n 都是 偶数 ;另给你一个整数 k 。
矩阵由若干层组成,如下图所示,每种颜色代表一层:
矩阵的循环轮转是通过分别循环轮转矩阵中的每一层完成的。在对某一层进行一次循环旋转操作时,层中的每一个元素将会取代其 逆时针 方向的相邻元素。轮转示例如下:
返回执行 k 次循环轮转操作后的矩阵。
示例 1:
输入:grid = [[40,10],[30,20]], k = 1
输出:[[10,20],[40,30]]
解释:上图展示了矩阵在执行循环轮转操作时每一步的状态。
示例 2:
输入:grid = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], k = 2
输出:[[3,4,8,12],[2,11,10,16],[1,7,6,15],[5,9,13,14]]
解释:上图展示了矩阵在执行循环轮转操作时每一步的状态。
提示:
m == grid.length
n == grid[i].length
2 <= m, n <= 50
m 和 n 都是 偶数
1 <= grid[i][j] <= 5000
1 <= k <= 109
代码:
class Solution {
public:
int getind(int init,int len){
if(init<0){
return getind(init+len,len);
}
return init%len;
}
vector<vector<int>> rotateGrid(vector<vector<int>>& grid,int k){
int h=grid.size(),w=grid[0].size();
//vector<vector<int>> v(h,vector<int>(w,0));
int num=min((h+1)/2,(w+1)/2);
for(int i=0;i<num;i++){
int tlen=2*(h-2*i)+2*(w-2*i)-4;
vector<int> temp(tlen,0);
int count=0;
for(int l=i;l<w-i-1;l++,count++){
temp[getind(count-k%tlen,tlen)]=grid[i][l];
}
for(int l=i;l<h-i-1;l++,count++){
temp[getind(count-k%tlen,tlen)]=grid[l][w-i-1];
}
for(int l=w-i-1;l>i;l--,count++){
temp[getind(count-k%tlen,tlen)]=grid[h-i-1][l];
}
for(int l=h-i-1;l>i;l--,count++){
temp[getind(count-k%tlen,tlen)]=grid[l][i];
}
count=0;
for(int l=i;l<w-i-1;l++,count++){
grid[i][l]=temp[count];
}
for(int l=i;l<h-i-1;l++,count++){
grid[l][w-i-1]=temp[count];
}
for(int l=w-i-1;l>i;l--,count++){
grid[h-i-1][l]=temp[count];
}
for(int l=h-i-1;l>i;l--,count++){
grid[l][i]=temp[count];
}
}
return grid;
}
};
想法:
把矩形分成一层一层的,每层按需遍历之后和k结合取余push到一个数组中,然后再将这个数组填到对应的位置上去;嗯!