【LeetCode & 剑指offer刷题】矩阵题2:29 顺时针打印矩阵(54. Spiral Matrix)(系列)
【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)
54. Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
Example 1:
Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
//以螺旋顺序输出矩阵元素(顺时针)
/*
确定某一层矩形对角点坐标,(begin,begin)、(rowend,colend)
扫描顺序如下:
-----→
↑ |
| |
| |
←----↓
*/
class Solution
{
public:
vector<int> spiralOrder(vector<vector<int>>& a)
{
vector<int> result;
if(a.empty()) return result;
int begin = 0; //起始点坐标
int rowend = a.size() - 1; //对角点坐标
int colend = a[0].size() - 1;
while(begin <= rowend && begin <= colend)
{
for(int j = begin; j <= colend; j++) //输出上行 i = begin,j = begin ~ colend
{
result.push_back(a[begin][j]);
}
for(int i = begin+1; i <= rowend; i++) //输出右边列 i = begin+1 ~ rowend, j = colend
{
result.push_back(a[i][colend]);
}
if(begin < rowend) //防止最后只有一行
{
for(int j = colend-1; j >= begin; j--) //输出下行 若begin<rowend, i = rowend, j = colend-1 ~ begin
{
result.push_back(a[rowend][j]);
}
}
if(begin < colend) //防止最后只有一列
{
for(int i = rowend-1; i >= begin+1; i--) //输出左边列 若begin<colend, i = rowend-1 ~ begin+1, j = begin
{
result.push_back(a[i][begin]);
}
}
begin++; //缩至内圈
rowend--;
colend--;
}
return result;
}
};
59. Spiral Matrix II
Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
Example:
Input: 3
Output:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
/*
问题:按螺旋的顺序来填数
与 Spiral Matrix类似
*/
class Solution
{
public:
vector<vector<int>> generateMatrix(int n)
{
vector<vector<int>> a(n, vector<int>(n));
if(n<1) return a;
int begin = 0; //起始点坐标
int rowend = n-1; //对角点坐标
int colend = n-1;
int val = 1;
while(begin <= rowend && begin <= colend)
{
for(int j = begin; j <= colend; j++) //赋值上行 i = begin,j = begin ~ colend
{
a[begin][j] = val++; //++在后为先用后加,故val初值为1
}
for(int i = begin+1; i <= rowend; i++) //赋值右边列 i = begin+1 ~ rowend, j = colend
{
a[i][colend] = val++;
}
if(begin < rowend) //防止最后只有一行
{
for(int j = colend-1; j >= begin; j--) //赋值下行 若begin<rowend, i = rowend, j = colend-1 ~ begin
{
a[rowend][j] = val++;
}
}
if(begin < colend) //防止最后只有一列
{
for(int i = rowend-1; i >= begin+1; i--) //赋值左边列 若begin<colend, i = rowend-1 ~ begin+1, j = begin
{
a[i][begin] = val++;
}
}
begin++; //缩至内圈
rowend--;
colend--;
}
return a;
}
};