【leetcode】59-螺旋矩阵 II【C/C++】

题目如下:

【leetcode】59-螺旋矩阵 II【C/C++】_第1张图片

解题思路:

对于这种螺旋遍历的方法,重要的是要确定上下左右四条边界的位置。

  • 初始化时,上边界up就是0,下边界down就是n-1,左边界left是0,右边界right是n-1;
  • 然后进行while循环,先遍历上边界,将对应元素加入结果res,然后上边界下移一位,如果此时上边界大于下边,说明此时已经遍历完成了,直接break。;
  • 之后遍历右边界,将对应元素加入结果res,然后右边界左移一位,如果此时右边界小于左边界,说明此时已经遍历完成了,直接break;
  • 下边界和左边界同理。

代码如下:

class Solution {
public:
    vector> generateMatrix(int n) {
        vector> res(n, vector (n)); //需要对res进行初始化
        int up = 0, down = n-1;    //螺旋矩阵的上下边界
        int left = 0, right = n-1; //螺旋矩阵的左右边界
        int i = 1;
        while(true){
            //上方元素
            for(int j = left; j <= right && i <= n*n; j++){
                res[up][j] = i;
                i++;
            }
            if(up++ > down) break; //更新上边界并判断
            //右方元素
            for(int j = up; j <= down && i <= n*n; j++){
                res[j][right] = i;
                i++;
            }
            if(right-- < left) break; //更新右边界并判断
            //下方元素
            for(int j = right; j >=left && i <= n*n; j--){
                res[down][j] = i;
                i++;
            }
            if(down-- < up) break; //更新下边界并判断
            //左方元素
            for(int j = down; j >= up && i <= n*n; j--){
                res[j][left] = i;
                i++;
            }
            if(left++ > right) break; //更新左边界并判断
        }
        return res;
    }
};

【leetcode】59-螺旋矩阵 II【C/C++】_第2张图片

你可能感兴趣的:(leetcode算法题库)