leetcode 1914. 循环轮转矩阵 中等

给你一个大小为 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

分析:对于一个 m×n 的矩阵 grid,它的层数为 min(m/2,n/2)。可以从外向内枚举矩阵的每一层模拟循环轮转操作。

从左上角起按照逆时针方向遍历每一层的元素,遍历过程分为四个部分,每个部分按顺序遍历每条边除了最后一个元素以外的所有元素。将这些元素的值保存在数组 num 中,并计算元素总数,即数组的长度 len。此时,如果对该层元素进行 len 次循环轮转操作,那么该层元素不会改变。因此,实际的循环轮转操作数量即为 k=k%len。

之后重新按照顺时针遍历行列坐标数组,并在 grid 中更新每个坐标对应的轮转操作后的取值。枚举并更新完所有层后,grid 即为轮转操作后的矩阵。

cpp 复制代码
class Solution {
public:
    vector<vector<int>> rotateGrid(vector<vector<int>>& grid, int k) {
        vector<vector<int>>ans=grid;
        int m=grid.size(),n=grid[0].size(),layer=min(m,n)/2;
        for(int l=0;l<layer;++l)
        {
            int x=0+l,y=0+l,len=(m-l*2)*2+(n-l*2)*2-4,cnt=0;
            int left=y,right=n-l,down=m-l,f1,f2;f1=f2=0;
            vector<int>num;
            while(cnt<len)
            {
                num.push_back(grid[x][y]);cnt++;
                if(y+1<right&&!f1)y++;
                else if(x+1<down&&!f2)x++,f1=1;
                else if(y-1>=left)y--,f2=1;
                else x--;
            }
            f1=f2=0;

            x=0+l,y=0+l;
            for(int i=0,j=k%cnt;i<cnt;++i,j=(j+1)%cnt)
            {
                ans[x][y]=num[j];
                if(y+1<right&&!f1)y++;
                else if(x+1<down&&!f2)x++,f1=1;
                else if(y-1>=left)y--,f2=1;
                else x--;
            }
        }
        return ans;
    }
};
相关推荐
圣保罗的大教堂13 小时前
leetcode 3619. 总价值可以被 K 整除的岛屿数目 中等
leetcode
文丑颜不良啊19 小时前
LeetCode1141~1160题目解析
java·leetcode
木井巳19 小时前
【动态规划: 路径问题】下降路径最小和
java·算法·leetcode·动态规划·推荐算法
ynchyong20 小时前
培养程序化思维
leetcode·程序化思维·刷题经验
YLCHUP1 天前
【模拟&STL】题解:AT_abc203_e [ABC203E] White Pawn_基础算法_数据结构_STL模板库_AtcoderABC_C++算法竞赛
数据结构·c++·算法·leetcode·动态规划·哈希算法·近邻算法
(●—●)橘子……1 天前
力扣 第525场周赛 练习理解
数据结构·python·学习·算法·leetcode
wenyq71 天前
LeetCode 152. Maximum Product Subarray
java·算法·leetcode
文丑颜不良啊1 天前
LeetCode1181~1200题目解析
java·leetcode
海绵宝宝转agent1 天前
Leetcode100+面经
java·笔记·学习·算法·leetcode·深度优先
Shaoshing1 天前
LeetCode100 283.移动零
java·数据结构·算法·leetcode