螺旋遍历二维数组

49 阅读1分钟

LCR 146. 螺旋遍历二维数组

一维数组的初始化和 push_back 冲突

class Solution {
public:
    vector<int> spiralArray(vector<vector<int>>& array) {
        int startx = 0;
        int starty = 0;
        int i, j;

        //创建一维数组
        vector<int> nums(array.size()* array.size(), 0);

        int offset = 1;
        //二维数组的行数
        int loop = array.size()/2;

        while (loop--)
        {
            for (j = starty; j < array.size() - offset; j++)
                nums.push_back(array[startx][j]);
            for (i = startx; i < array.size() - offset; i++)
                nums.push_back(array[i][j]);
            for(;j>starty;j--)
                nums.push_back(array[i][j]);
            for(;i>startx;i--)
                nums.push_back(array[i][j]);
            offset++;
            startx++;
            starty++;
        }
        if (array.size() % 2==1)
            nums.push_back(array[array.size() / 2][array.size() / 2]);

        return nums;
    }
};

image.png

对于

vector<int> nums(array.size() * array.size(), 0);

这里初始化了一维数组 nums,长度为 array.size() * array.size(),并将所有元素初始化为 0
然而,你在后续代码中使用了 nums.push_back() 添加新元素,这会使得 nums 的长度远超出预期,因为之前分配的空间不会被自动覆盖。

修正方法: 不要初始化固定长度,而直接定义空的 vector

修正后:

vector<int> nums;

解决之后发现,矩阵不一定是方阵!然后又有很多问题,看了题解才解出来。

class Solution {
public:
    vector<int> spiralArray(vector<vector<int>>& array) {
        if (array.size() == 0 || array[0].size() == 0)
            return {};

        //列数
        int up = 0;
        int down = array.size()-1;
        //行数
        int left = 0;
        int right = array[0].size()-1;

        //创建数组
        vector<int> nums;

        while (true)
        {
            for (int j = left; j <= right; j++)
                nums.push_back(array[up][j]);
            up++;
            if (up > down)
                break;
                       
            for (int i = up; i <= down; i++)
                nums.push_back(array[i][right]);
            right--;
            if (left > right)
                break;
           
            for (int j = right; j >= left; j--)
                nums.push_back(array[down][j]);
            down--;
            if (up > down)
                break;
            
            for (int i = down; i >= up; i--)
                nums.push_back(array[i][left]);
            left++;
            if (left > right)
                break;
        }
        return nums;
    }
};

image.png