【LeetCode】1260. 二维网格迁移(C++)

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;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码两年半的练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值