顺时针打印矩阵
解题思路
- 四条边应该都利用左闭右开区间
- 要注意每次旋转的起始位置 和 矩阵长宽
- 最后应该是剩下一个横条 或竖条 ,这点可以模拟几次 再得出结论
代码
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.empty() || matrix[0].empty() ) return {};
int startX=0,startY=0;
int width= matrix[0].size() ;
int height= matrix.size();
std::vector<int> res;
while(width>1&& height>1)
{
//left->right
for(int x= startX;x< startX+ width-1;x++)
{
// std::cout<< matrix[startY][x] << " ";
res.push_back(matrix[startY][x]);
}
//up -> down
int endX= startX+ width-1;
for(int y=startY;y<startY+height-1;y++)
{
//std::cout << matrix[y][endX]<< " ";
res.push_back( matrix[y][endX]);
}
int endY=startY+height-1;
//right ->left
for(int x= endX;x>startX;x-- )
{
// std::cout << matrix[endY][x] << " ";
res.push_back( matrix[endY][x]) ;
}
//down -> up
for(int y= endY;y>startY; y--)
{
// std::cout << matrix[y][startX] << " ";
res.push_back(matrix[y][startX]);
}
startX++;
startY++;
width -= 2;
height-=2;
}
//最后应该是剩下一个横条 或竖条
if(height==1)
{
for(int m=startX;m<startX+width;m++)
res.push_back(matrix[startY][m]);
}else if(width==1)
{
for(int n=startY;n<startY+height;n++)
res.push_back(matrix[n][startX]);
}
// if( matrix.size() %2 ) res.push_back(matrix[startY][startX]);
return res;
}
};
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。