1 题目描述
给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。
每次「迁移」操作将会引发下述活动:
- 位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
- 位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。
- 位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。
- 请你返回 k 次迁移操作后最终得到的 二维网格。
2 示例描述
2.1 示例1
输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[9,1,2],[3,4,5],[6,7,8]]
2.2 示例2
输入:grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4
输出:[[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]]
2.3 示例3
输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9
输出:[[1,2,3],[4,5,6],[7,8,9]]
3 解题提示
m == grid.length
n == grid[i].length
1 <= m <= 50
1 <= n <= 50
-1000 <= grid[i][j] <= 1000
0 <= k <= 100
4 解题思路
根据大佬的思路来:
每个元素会向右移动k次,当元素列索引n+k大于列长度n时,元素就会换行。
我们设m为行数,n为列数,原始grid位置用grid[i][j]表示,移动后的坐标用res[x][y]表示:
- 对于纵坐标y,移动的次数k等于列长度n时列坐标j无变化(只是换行),所以y = j + k % n,但当j足够大时y会超过n的值,此时超过的效果仍是换行,所以还要对n求模,最终y = (j + k % n) % n;
- 对于横坐标x,当前元素(j+k)>n的话就会换行,增加的数取决于换的行数:(j + k)/n。对于列来说移动次数k=n时列坐标j不变,同理对于行来说移动次数k=mn时行坐标i也不变,相当于所有位置移动了一遍又回到原处,所以变化的x = (j + k % (mn)) / n。同理,当k足够大时,x会超过m值,此时超过的行数足够多时相当于行数没变,所以还要对m求模,最终x = ((j + k % (m*n)) / n) % m.
5 源码详解(C++)
class Solution {
public:
vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
vector<vector<int>> res( grid.size() , vector<int>( grid[0].size() , 0 ) ) ;
int now_x = 0 , now_y = 0 ;
for ( int i = 0 ; i < grid.size() ; i ++ )
{
for ( int j = 0 ; j < grid[0].size() ; j ++ )
{
now_x = (i + ( j + k % ( grid.size() * grid[0].size() ) ) / grid[0].size() ) % grid.size() ;
now_y = (j + k % grid[0].size() ) % grid[0].size() ;
res[now_x][now_y] = grid[i][j];
}
}
return res;
}
};