LeetCode——5798. 循环轮转矩阵[Cyclically Rotating a Grid][中等]——分析及代码[Java]
一、题目
给你一个大小为 m x n 的整数矩阵 grid ,其中 m 和 n 都是 偶数 ;另给你一个整数 k 。
矩阵由若干层组成,矩阵的循环轮转是通过分别循环轮转矩阵中的每一层完成的。在对某一层进行一次循环旋转操作时,层中的每一个元素将会取代其 逆时针 方向的相邻元素。
返回执行 k 次循环轮转操作后的矩阵。
示例 1:
输入:grid = [[40,10],[30,20]], k = 1
输出:[[10,20],[40,30]]
示例 2:
输入:grid = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], k = 2
输出:[[3,4,8,12],[2,11,10,16],[1,7,6,15],[5,9,13,14]]
提示:
- m == grid.length
- n == grid[i].length
- 2 <= m, n <= 50
- m 和 n 都是 偶数
- 1 <= grid[i][j] <= 5000
- 1 <= k <= 10^9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cyclically-rotating-a-grid
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 逐层旋转
(1)思路
根据题目要求,逐层旋转矩阵,通过对 k 按每层数字量取余,避免整圈循环的部分。
(2)代码
class Solution {
public int[][] rotateGrid(int[][] grid, int k) {
int m = grid.length, n = grid[0].length;
int layer = Math.min(m, n) >> 1;//层数
for (int i = 0; i < layer; i++) {//从外向内逐层旋转
int col = m - 2 * i, row = n - 2 * i;//该层行、列数
int round = col * 2 + row * 2 - 4;//该层整数数量
int step = k % round;//待旋转步数,取余省略整圈部分
for (int time = 0; time < step; time++) {
int temp = grid[i][i];
for (int j = 1; j < row; j++)//上侧旋转
grid[i][i + j - 1] = grid[i][i + j];
for (int j = 1; j < col; j++)//右侧旋转
grid[i + j - 1][i + row - 1] = grid[i + j][i + row - 1];
for (int j = 1; j < row; j++)//下侧旋转
grid[i + col - 1][i + row - j] = grid[i + col - 1][i + row - 1 - j];
for (int j = 1; j < col; j++)//左侧旋转
grid[i + col - j][i] = grid[i + col - j - 1][i];
grid[i + 1][i] = temp;
}
}
return grid;
}
}
(3)结果
执行用时 :7 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :38.9 MB,在所有 Java 提交中击败了 100.00% 的用户。
(目前提交用户量不足,暂无排名)
三、其他
暂无。