LeetCode——5798. 循环轮转矩阵(Cyclically Rotating a Grid)[中等]——分析及代码(Java)

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% 的用户。
(目前提交用户量不足,暂无排名)

三、其他

暂无。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值