【力扣一轮】数组-旋转矩阵

旋转矩阵

题目链接

随想录链接

旋转的方式把数字一个接一个写入矩阵中。

这时需要用到循环不变量,它是一个循环,每次处理的时候需要处理的方式是一样的,而不是有着条件的限制。

对于这道题,循环不变量就是边元素的处理,只处理当前边的起始元素,不处理当前边的末尾元素。

对于奇数矩阵还是偶数矩阵,只是多加一个元素指定值。

调试之后,发现自己欠缺考虑有几点。

1.对于循环退出条件,没有考虑到,需要设置。

2.对于进入再次循环的条件,没有考虑到,具体体现在for循环中用到了n,而n是作为退出条件改变了。

3.对于奇数矩阵和偶数矩阵的处理,没有考虑到中间值。

4.定义二维矩阵。

以上4点,导致看了4次卡尔老师的代码,才完成。

vector<vector<int>> generateMatrix(int n) {
//    vector<vector<int>> vt;
    vector<vector<int>> vt(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
    int final = n;
    int start_x = 0;
    int start_y = 0;
    int offset = 1;
    int count =1;
    int loop = n; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
    int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
    int i ;
    int j ;
    while(n/2){
        //处理圈的北边,i不动,j变大。
        //因为每一条边不包括最后一个元素,所以会有n-offset。
        for(j = start_y ; j< loop-offset ; j++){
            vt[start_x][j]=count++;
        }
        //处理圈的东边,j不变,i变大。
        for(i = start_x ; i< loop-offset ; i++){
            vt[i][j] = count++;
        }
        //处理圈的南边,此时i,j皆为最大,但i不动,j变小。
        for( j = j ;j >start_y; j --){
            vt[i][j] = count++;
        }
        //处理圈的西边,此时j为最小,i逐渐变小。
        for( i = i ; i > start_x ; i--){
            vt[i][j] = count++;
        }
        start_x++;
        start_y++;
        offset++;
        n--;
    }

    if (final%2 ){
        vt[mid][mid]=count;
    }
    return vt;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你的铭称

随缘惜缘不攀缘。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值