一、题解:上下左右四条线不断收紧
int l = 0, r = matrix[0].size() - 1;
int high = 0, low = matrix.size() - 1;
- 从左到右,顶部一层遍历完往下移一位,high++;
if(++high>low) break;//遍历完了
- 从上到下,遍历完右侧往左移一位,right–;
if(--r<l) break; //表示结束
- 从右到左,遍历完底部上移,low–;
if(--low<high) break;//表示结束
- 从下到上,遍历完左侧右移,left++;
if(++l>r) break; //表示结束
二、步骤动画演示
以下步骤为重复第一步的步骤
此时,high>low
表明越界(已经遍历完成)break
即可。
三、完整代码实现
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
int l=0,r=matrix[0].size()-1,high=0,low=matrix.size()-1;
//定义边界
vector<int>res;
while(true)
{
for(int i=l;i<=r;i++) res.push_back(matrix[high][i]); //l-->r
if(++high>low) break;//遍历完了
for(int i=high;i<=low;i++) res.push_back(matrix[i][r]); //high-->low
if(--r<l) break;
for(int i=r;i>=l;i--) res.push_back(matrix[low][i]); //r-->l
if(--low<high) break;
for(int i=low;i>=high;i--) res.push_back(matrix[i][l]);//low-->high
if(++l>r) break;
}
return res;
}
};