解题思路:
本质上就是数组出列入列的过程,也就是说每个数在原先位置上往后挪动了k个位置,那么就要考虑到行和列的关系,代码如下:
class Solution {
public:
vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
int m = grid.size(), n = grid[0].size();
vector<vector<int>> ans(m, vector<int>(n));
int row, col;
for(int i = 0; i < m; i ++) {
for(int j = 0; j < n; j ++) {
row = (i + (k + j) / n) % m;
col = (j + k % n) % n;
ans[row][col] = grid[i][j];
}
}
return ans;
}
};
但是这种处理还是稍显麻烦,尤其是行和列,需要考虑到是否越两个界限的情况,而另一种方法将数组位置化为一维数组,再往后移动然后复原,更为简便,代码如下:
class Solution {
public:
vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
int m = grid.size(), n = grid[0].size();
vector<vector<int>> ans(m, vector<int>(n));
for(int i = 0; i < m; i ++) {
for(int j = 0; j < n; j ++) {
int index = (n * i + j + k) % (m * n);
ans[index / n][index % n] = grid[i][j];
}
}
return ans;
}
};