1260. Shift 2D Grid

问题:

给定一个二维数组,

对二维数组进行以下变化:

  • 按列(头尾循环)向右平移1位
  • 对第一列,按行(头尾循环)向下平移1位。

对数组做K次以上操作。求得到的新数组。

Example 1:
Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
Output: [[9,1,2],[3,4,5],[6,7,8]]

Example 2:
Input: grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4
Output: [[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]]

Example 3:
Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9
Output: [[1,2,3],[4,5,6],[7,8,9]]
 

Constraints:
m == grid.length
n == grid[i].length
1 <= m <= 50
1 <= n <= 50
-1000 <= grid[i][j] <= 1000
0 <= k <= 100

 

 

 

解法:

列数平移K位,那么原来的第j列,将被移到,(j+K)%列数

第一列会被平移行数K位,那么原来的第i行第j列的元素,离第一列的距离位:j,那么它会被移动行数为:(i+(j+K)%列数)%行数

 

下面代码:列数=n,行数=m

代码参考:

 1 class Solution {
 2 public:
 3     vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
 4         int m=grid.size(), n=grid[0].size();
 5         int col=k%n;
 6         vector<vector<int>> res(grid);
 7         for(int i=0; i<m; i++){
 8             for(int j=0; j<n; j++){
 9                 res[(i+(j+k)/n)%m][(j+col)%n]=grid[i][j];
10             }
11         }
12         return res;
13     }
14 };

 

另外一种方法:

每一个元素[i,j]看作一个数,值为:i*列数+j

进制为:列数

上述的移动操作,可以看作是,

对于每一个值进行+1操作,而到第一列的时候,该进位,刚好也满足+1的操作。

因此,每一个元素经过K次操作,即为:value=i*列数+j+K

而最终所处的位置即是:[value/列数][value%列数]

⚠️ 注意:由于数组为循环移动,所以整个数组有时以 列数*行数 为一循环。

因此在得出value的时候,需要 %列数*行数 取模。

 

代码参考:

 1 class Solution {
 2 public:
 3     vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
 4         int m=grid.size(), n=grid[0].size();
 5         vector<vector<int>> res(grid);
 6         for(int i=0; i<m; i++){
 7             for(int j=0; j<n; j++){
 8                 int value=(i*n+j+k)%(m*n);
 9                 res[value/n][value%n]=grid[i][j];
10             }
11         }
12         return res;
13     }
14 };

 

posted @ 2020-07-19 16:07  habibah_chang  阅读(137)  评论(0编辑  收藏  举报