Note:
展成一维数组,题里就是把最后的K位置移动到开头的位置
1、整个数组翻转
2、0 ~ k
翻转
3、k ~ n * m
翻转
即可达到效果,翻转的时候不用先真的展开成一维数组,建立映射关系进行swap
即可
代码如下:
class Solution {
public:
int n, m;
void reverse(vector<vector<int>>& g, int start, int end){
for(int i = start, j = end - 1; i < j; i ++, j --)
swap(g[i / m][i % m], g[j / m][j % m]);
}
vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
n = grid.size(), m = grid[0].size();
k %= n * m;
reverse(grid, 0, n * m);
reverse(grid, 0, k);
reverse(grid, k, n * m);
return grid;
}
};