题目的思路是每次确定左上顶点和右下顶点,然后进行一个框的打印,注意边界条件。然后设计一个打单行和单列的算法。一个小错误如果vector为空的话调用.size()方法会引发空指针异常,所以先判空再进行下面的操作。
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if (matrix.empty() || matrix[0].empty()) return {}; int m = matrix.size(); int n = matrix[0].size(); int x1 = 0, y1 = 0, x2 = m - 1, y2 = n - 1; vector<int>res; int i = 0, j = 0; while (x1 <= x2 && y1 <= y2) { if (x1 == x2 || y1 == y2)//棒状结构,特殊处理 { if(x1==x2&&y1==y2) { res.push_back(matrix[x1][y1]); return res; } else if(x1==x2)//一行 { for(j=y1;j<=y2;j++) res.push_back(matrix[x1][j]); return res; } else { for(i=x1;i<=x2;i++) { res.push_back(matrix[i][y1]); } return res; } } while (j < y2) { res.push_back(matrix[i][j]); j++; } while (i < x2) { res.push_back(matrix[i][j]); i++; } while (j > y1) { res.push_back(matrix[i][j]); j--; } while (i > x1) { res.push_back(matrix[i][j]); i--; } x1++; y1++; x2--; y2--; i++; j++; } return res; } };