59螺旋数组 -- 循环不变量

螺旋数组

螺旋数组本身没有具体的算法,但是通过该题目可以加强对搜索区间和循环不变量的理解。

1. 搜索区间

所谓搜索区间既每次循环时的搜索范围,常见的有:

  1. 左闭右闭:[left, right]
  2. 左闭右开:[left, right)

本题选用的是左闭右开搜索区间。

2. 循环不变量

所谓循环不变量既每次循环时都应遵循的准则,在本题中则代表,每次循环时都应保持[right, left)的搜索区间,不能一会[left, right)一会[right, left]
59螺旋数组 -- 循环不变量_第1张图片

  1. 代码

    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> matrix(n, vector<int>(n));
        int startX = 0;  // 定义起始位置X
        int startY = 0;  // 定义起始位置Y
        int offset = 1;  // 定义没事循环时的偏移值 
        int count = 1;  // 定义填充值
        int i = 0, j = 0;  // 定义循环变量
        int loop = n / 2; // 确定转几圈(每次循环,都有上下两条边被填充,故n/2)
        while(loop--){ 
            for(j = startY; j < n - offset; j++)  // 填充“上”边
                matrix[startX][j] = count++;
            for(i = startX; i < n -offset; i++)  // 填充“右”边
                matrix[i][j] = count++;
            for(;j > startY; j--)  // 填充“下”边
                matrix[i][j] = count++;
            for(;i > startX; i--)  // 填充“左”边
                matrix[i][j] = count++; 
            startX++; startY++; offset++;  // 更新循环变量
        }
        if(n % 2 == 1)  // 如果n为奇数,则最中间一个空需要单独填充
            matrix[n/2][n/2] = count++;
        return matrix;
    }
    

你可能感兴趣的:(算法,算法,数据结构,c++)