1.一维辅助数组
新建一个大小为m*n的一维数组,原矩阵操作相当于把一维数组的元素后移K位
平移使用了vector中的reverse
如1 2 3 4 5 k=3
reverse(res.begin(),res.end());//res为5 4 3 2 1
reverse(res.begin(),res.begin()+k);//res为4 5 3 2 1
reverse(res.begin()+k,res.end());//res为4 5 1 2 3
代码如下:
class Solution {
public:
vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
//类似一维数组后移K位
int m=grid.size();
int n=grid[0].size();
k=k%(m*n);
if(k==0)
return grid;
vector<int> res(m*n,0);//
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
res[i*n+j]=grid[i][j];
//后移k位
reverse(res.begin(),res.end());
reverse(res.begin(),res.begin()+k);
reverse(res.begin()+k,res.end());
//赋值给原矩阵
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
grid[i][j]=res[i*n+j];
return grid;
}
};
2.二维辅助数组
可以发现对于I,j位置的元素更新后:
j变为j+k,为了防止出界,新的j为(j+k)%n
i变为i+(j+k)/n,为了防止i出界,新的I为(i+(j+k)/n)%m
代码如下:
class Solution {
public:
vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
int m=grid.size();
int n=grid[0].size();
k=k%(m*n);
if(k==0)
return grid;
vector<vector<int>> res(m,vector<int>(n,0));//
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
res[(i+(j+k)/n)%m][(j+k)%n]=grid[i][j];
return res;
}
};