思路:
剥洋葱的思路,一开始有俩个指针指向左上角和右下角,根据这个分别从左向右,从上向下,从右到左,从下到上,就完成了顺时针遍历矩阵的要求了。
然后我们左上角的点向右下移动,右下角的点向左上移动。最终当其位置一样或左上角的位置大于右下角的位置停止遍历。
需要注意特殊情况为左上角的点和右下角的点在同一行,或者同一列的情况下的时候我们需要特殊处理。
class Solution {
public:
vector<int> ans;
vector<int> printMatrix(vector<vector<int> > matrix) {
int tR = 0;
int tC = 0;
int dR = matrix.size()-1;
int dC = matrix[0].size()-1;
while(tR<=dR&&tC<=dC)
{
rotateMatrix(matrix,tR++,tC++,dR--,dC--);
}
return ans;
}
void rotateMatrix(vector<vector<int>> &arr,int tR,int tC,int dR,int dC)
{
if(tR == dR)
{
for(int i = tC;i<=dC;++i)
{
ans.push_back(arr[tR][i]);
}
}
else if(tC == dC)
{
for(int i = tR;i<=dR;++i)
{
ans.push_back(arr[i][tC]);
}
}
else{
int curR = tR;
int curC = tC;
while(curC<dC)
{
ans.push_back(arr[tR][curC]);
curC++;
}
while(curR<dR)
{
ans.push_back(arr[curR][dC]);
curR++;
}
while(curC>tC)
{
ans.push_back(arr[dR][curC]);
curC--;
}
while(curR>tR)
{
ans.push_back(arr[curR][tC]);
curR--;
}
}
}
};