题目:
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例:
输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
解题思路:
通过设置上下左右边界,使用过了之后再继续更新边界,一直循环这些操作,直到上下边界越界或者左右边界越界,跳出循环,返回结果。
源代码如下:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.empty()) return res;//当数组为空时,直接返回空数组res
int up=0;//定义上边界
int down=matrix.size()-1;//下边界
int left=0;//左边界
int right=matrix[0].size()-1;//右边界
//当上下左右边界越界时,说明已经全部遍历完了,直接break
while(true)
{
//上边界的值存放至数组中
for(int i=left;i<=right;i++)
{
res.push_back(matrix[up][i]);
}
//更新上边界并判断是否越界,越界则break
if(++up>down) break;
//右边界的值存放至数组中
for(int i=up;i<=down;i++)
{
res.push_back(matrix[i][right]);
}
if(--right<left) break;//更新右边界并判断是否越界,越界则break
for(int i=right;i>=left;i--)//下边界的值存放至数组中
{
res.push_back(matrix[down][i]);
}
if(--down<up) break;//更新下边界并判断是否越界,越界则break
for(int i=down;i>=up;i--)//左边界的值存放至数组中
{
res.push_back(matrix[i][left]);
}
if(++left>right) break;//更新左边界并判断是否越界,越界则break
}
//返回结果数组
return res;
}
};
升级:
给你一个正整数 `n` ,生成一个包含 `1` 到 `n2` 所有元素,且元素按顺时针顺序螺旋排列的 `n x n` 正方形矩阵 `matrix` 。
示例:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
解题思路:
依旧是设置上下左右边界,定义一个n*n的二维数组,顺时针向二维数组中插入数据,直到插入的数据大于n^2,每一次for循环都要更新边界。
源代码如下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> matrix(n,vector<int>(n));//定义n*n的二维数组
int up=0;//上边界
int down=n-1;//下边界
int left=0;//左边界
int right=n-1;//右边界
int k=1;//从元素1开始插入到二维数组中
int num=n*n;//总共不超过n的平方
//循环结束条件为插入的元素值超过n的平方
while(k<=num)
{
for(int i=left;i<=right;i++)//上边界
{
matrix[up][i]=k++;
}
up++;//将上边界插入了过后记得要更新上边界的值
for(int i=up;i<=down;i++)//右边界
{
matrix[i][right]=k++;
}
right--;
for(int i=right;i>=left;i--)//下边界
{
matrix[down][i]=k++;
}
down--;
for(int i=down;i>=up;i--)//左边界
{
matrix[i][left]=k++;
}
left++;
}
//返回二维数组
return matrix;
}
};