本文将持续更新
螺旋矩阵遍历,其实本身是一个描述类问题,本来不想总结,但由于lc把它标为简单题,导致人在极度愤怒的情况下做不明白。故想总结一下。
在处理描述性问题的时候,一定要找规律尤其是不变的方法。

class Solution {
public:vector> generateMatrix(int n) {vector> arr;arr.resize(n);for(int i=0;ii){arr[a][b]=count;count++;b--;}while(a>i){arr[a][b]=count;count++;a--;}i++;}return arr;}
};
这个玩意真的折磨,题主在做的时候没有考虑周全矩阵的结束形状,导致花费了好多时间:
1.只需要遍历的时候将正方形的边使用矩形的两边来表示。
2.当结束的时候,行或者列有一个为1,此时符合,需要特殊情况处理,类似正方形中只有一个元素。我的处理方式是直接使用两个for循环来加载所有元素。
class Solution {
public:vector spiralOrder(vector>& matrix) {vector arr;arr.resize(matrix.size()*matrix[0].size());int a=0;//行下标int b=0;//列下标int i=0;//每一层起始位置int d=0;//每一圈有几个元素int count=0;//数组下标int Row=matrix.size();int Col=matrix[0].size();int size=Row i){ arr[count]=matrix[a][b];count++;b--;}while(a>i){arr[count]=matrix[a][b];count++;a--;}i++;}return arr;}
};
但是这段代码在剑指offer中是通过不了的,时间超时,但是在这里可以通过。
在剑指offer中看到了这样一种写死循环的写法,通过对边界的判定来结束死循环。
class Solution {
public:vector spiralOrder(vector>& matrix) {if (matrix.size() == 0 || matrix[0].size() == 0) return {};vector res;int top = 0; //上边界int bottom = matrix.size() - 1; //下边界int left = 0; //左边界int right = matrix[0].size() - 1; //右边界 while (true) {// 从左到右for (int i = left; i <= right; ++ i) res.push_back(matrix[top][i]);// 每次从左往右执行一次,则要往下移一层if (++ top > bottom) break;// 从上到下for (int i = top; i <= bottom; ++ i) res.push_back(matrix[i][right]);// 每次从上到下执行一次,则要往左移一列if (-- right < left) break;// 从右到左for (int i = right; i >= left; -- i) res.push_back(matrix[bottom][i]);// 每次从右到左执行一次,则要往上移一行if (-- bottom < top) break;// 从下到上for (int i = bottom; i >= top; -- i) res.push_back(matrix[i][left]);// 每次从下到上执行一次,则要往右移一列if (++ left > right) break;}return res;}
};
螺旋升天数组这类的描述型题目,非常考察统筹规划的能力,需要有一个明确清楚的思路再开始写代码,一般关键在于一层一层展开问题的时候找到那个统一的处理办法。
// 每次从下到上执行一次,则要往右移一列
if (++ left > right) break;
}
return res;
}
};
# 三、总结螺旋升天数组这类的描述型题目,非常考察统筹规划的能力,需要有一个明确清楚的思路再开始写代码,一般关键在于一层一层展开问题的时候找到那个统一的处理办法。本文将持续更新
下一篇:《解构领域驱动设计》读书笔记