leetcode1260二维网络迁移
题目
n*m的矩阵,一个整数k,移动矩阵k次。每次移动的操作为:
- 向右移动(最后一列移动到第一列)
- 之后,第一列向下移动。
1<=N、M<=50
0<=k<=100
题解
思考:
从总体思考:相当于向右移动k%m列;另mod=k%m,donw=k/m。则如果mod为0,则所有列都下移donw行。否则,前mod列移动donw+1行,后面的向下移动donw行。
代码上实现如下:向右tmp[i][(j+k)%grid[0].length]=grid[i][j];
,向下grid[(i+downTimes)%grid.length][j]=tmp[i][j];
。
这样避免实际根据k一个一个移动,时间复杂度为O(N*M)。
public List<List<Integer>> shiftGrid(int[][] grid, int k) { int[][] tmp=new int[grid.length][grid[0].length]; for (int i = 0; i < grid.length; i++) {//每行都向右移动k个单位 for (int j = 0; j < grid[0].length; j++) { tmp[i][(j+k)%grid[0].length]=grid[i][j]; } } //向下的列数 int donw=k/grid[0].length; int mod=k%grid[0].length; for (int i = 0; i < grid.length; i++) { for (int j = 0; j < grid[0].length; j++) { int downTimes=donw; if(j<mod){ downTimes++; } grid[(i+downTimes)%grid.length][j]=tmp[i][j]; } } //转化为输出要求的格式 List<List<Integer>> res=new ArrayList<>(grid.length); for (int i = 0; i < grid.length; i++) { List<Integer> list=new ArrayList<>(grid[0].length); for (int j = 0; j < grid[0].length; j++) { list.add(grid[i][j]); } res.add(list); } return res; }
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步