LeetCode 59

本文最后更新于:2021年9月8日 晚上

LeetCode 59

概述

​ 输入n,在n*n的矩阵中,从左上角开始,逆时针填入数字1-n2,然后输出矩阵

思路

  • 首页,应该能知道这题是一个模拟题

  • 手动模拟操作,可以发现,顺序上-右-下-左都是一样的,只是规模再变小。所以一次大循环里面,应该是把四个方向的任务完成。

  • 还要注意的是边界的选取,因为上-右、右-下、下-左,均是存在一个重叠的数字的。这里选择左闭右开,是因为每次处理一个方向后,循环变量还会加一,

    所以干脆直接将加一利用起来,再之后的方向继续使用,减少操作

    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
    vector<vector<int>> generateMatrix(int n) {
    vector<vector<int> > result(n, vector<int>(n, 0));
    int loop=n/2; //一次一圈,所以除2
    int startx=0,starty=0; //记录起始位置
    int i,j;
    int ans=1; //数字增量
    int offset=1; //相同循环操作的偏移量
    while(loop--){
    i=startx;
    j=starty;
    for(;j<n-offset+startx;j++) //注意j的范围是要有偏移量的
    result[i][j]=ans++;
    //因为采用左闭右开,所以j最后加出来的数,可以在下面的循环里直接用
    for(;i<n-offset+startx;i++)
    result[i][j]=ans++;

    for(;j>starty;j--)
    result[i][j]=ans++;

    for(;i>startx;i--)
    result[i][j]=ans++;
    //下一轮作准备
    startx++;
    starty++; //起始位置改变
    offset+=2; //偏移量改变
    }
    if (n%2) { //n是奇数,则存在一个正中间数会少loop一次,需要额外处理
    result[n/2][n/2] = ans;
    }
    return result;
    }

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!