当前位置:   article > 正文

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

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

旋转矩阵

题目链接

随想录链接

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

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

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

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

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

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/572686
推荐阅读
相关标签
  

闽ICP备14008679号