给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。
螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。
示例 1:
输入:array = [[1,2,3],[8,9,4],[7,6,5]] 输出:[1,2,3,4,5,6,7,8,9]
示例 2:
输入:array = [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]
输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]限制:
0 <= array.length <= 100 0 <= array[i].length <= 100
注意:本题与主站 54 题相同:https://leetcode-cn.com/problems/spiral-matrix/

vector<int> spiralArray(vector<vector<int>>& matrix) {
vector<int> ans;
if(!matrix.size() || !matrix[0].size()) return ans;
int eleNum = matrix.size() * matrix[0].size();
int maxUpper=0, maxLower=matrix.size()-1, maxLeft=0, maxRight=matrix[0].size()-1;
while(true){
if(ans.size()==eleNum) break;
else if(ans.size()!=eleNum && maxUpper==maxLower && maxLeft==maxRight){
ans.push_back(matrix[maxUpper][maxLeft]);
break;
}
else if(ans.size()!=eleNum && maxUpper==maxLower && maxLeft!=maxRight){//上下边界碰撞 且 未全部填入
for(int i=maxLeft; i<=maxRight; ++i) ans.push_back(matrix[maxUpper][i]);
break;
}
else if(ans.size()!=eleNum && maxUpper!=maxLower && maxLeft==maxRight){
for(int i=maxUpper; i<=maxLower; ++i) ans.push_back(matrix[i][maxLeft]);
break;
}
for(int i=maxLeft; i<=maxRight; ++i) ans.push_back(matrix[maxUpper][i]);
for(int i=maxUpper+1; i<=maxLower; ++i) ans.push_back(matrix[i][maxRight]);
for(int i=maxRight-1; i>=maxLeft; --i) ans.push_back(matrix[maxLower][i]);
for(int i=maxLower-1; i>maxUpper; --i) ans.push_back(matrix[i][maxLeft]);
maxUpper++; maxLeft++; maxLower--; maxRight--;
}
return ans;
}
在这个例子中,由于边界的递增时间设置得不够好,判断时间也不够好,所以增加了很多额外的判断,也就是先检查 ans.size()!=eleNum 后进行边界碰撞的判断:
设置好边界的更新时间和碰撞检查的时间,可以优化掉判断代码。
class Solution {
public:
vector<int> spiralArray(vector<vector<int>>& array)
{
if (array.empty()) return {};
int l = 0, r = array[0].size() - 1, t = 0, b = array.size() - 1;
vector<int> res;
while(true)
{
for (int i = l; i <= r; i++) res.push_back(array[t][i]); // left to right
if (++t > b) break;
for (int i = t; i <= b; i++) res.push_back(array[i][r]); // top to bottom
if (l > --r) break;
for (int i = r; i >= l; i--) res.push_back(array[b][i]); // right to left
if (t > --b) break;
for (int i = b; i >= t; i--) res.push_back(array[i][l]); // bottom to top
if (++l > r) break;
}
return res;
}
};
作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/lht9s3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。