Leetcode之循环轮转矩阵

题目:

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

代码:

    

class Solution {
public:
int getind(int init,int len){
    if(init<0){
        return getind(init+len,len);
    }
    return init%len;
}
vector<vector<int>> rotateGrid(vector<vector<int>>& grid,int k){
    int h=grid.size(),w=grid[0].size();
    //vector<vector<int>> v(h,vector<int>(w,0));
    int num=min((h+1)/2,(w+1)/2);
    for(int i=0;i<num;i++){
        int tlen=2*(h-2*i)+2*(w-2*i)-4;
        vector<int> temp(tlen,0);
        int count=0;
        for(int l=i;l<w-i-1;l++,count++){
            temp[getind(count-k%tlen,tlen)]=grid[i][l];
        }
        for(int l=i;l<h-i-1;l++,count++){
            temp[getind(count-k%tlen,tlen)]=grid[l][w-i-1];
        }
        for(int l=w-i-1;l>i;l--,count++){
            temp[getind(count-k%tlen,tlen)]=grid[h-i-1][l];
        }
        for(int l=h-i-1;l>i;l--,count++){
            temp[getind(count-k%tlen,tlen)]=grid[l][i];
        }
        count=0;
        for(int l=i;l<w-i-1;l++,count++){
            grid[i][l]=temp[count];
        }
        for(int l=i;l<h-i-1;l++,count++){
            grid[l][w-i-1]=temp[count];
        }
        for(int l=w-i-1;l>i;l--,count++){
            grid[h-i-1][l]=temp[count];
        }
        for(int l=h-i-1;l>i;l--,count++){
            grid[l][i]=temp[count];
        }
    }
    return grid;
}
};

想法:

把矩形分成一层一层的,每层按需遍历之后和k结合取余push到一个数组中,然后再将这个数组填到对应的位置上去;嗯!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值