第一题 LeetCode 59. 螺旋矩阵 II
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
//把正方形分成4块区域
int x=0,y=0;//开始遍历的位置
int loop=n/2;//循环圈数
int mid=n/2;//中心位置坐标
vector<vector<int>> ans(n, vector<int>(n, 0));
int cnt=1;
int offset=0;
while(loop--)
{
int i=x;
int j=y;
//左上方遍历
//左闭右开
for(;j<n-1-offset;j++)
{
ans[i][j]=cnt++;
}
//右上方遍历
//左闭右开
for(;i<n-1-offset;i++)
{
ans[i][j]=cnt++;
}
//右下方遍历
//左闭右开
for(;j>x;j--)
{
ans[i][j]=cnt++;
}
//左下方遍历
//左闭右开
for(;i>x;i--)
{
ans[i][j]=cnt++;
}
//下一次开始遍历的坐标
x++;
y++;
offset+=1;//每一次遍历结束后 把遍历的边长减一
}
if(n%2)
{
ans[x][y]=cnt;
}
return ans;
}
};
思路:即把n*n的区间分成四个部分(左闭右开)进行遍历,当n为奇数的时候,在矩阵之间要单独赋值
第二题 LeetCode 54. 螺旋矩阵
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例如下
输入: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]
代码
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
int n=matrix.size();
int m=matrix[0].size();
int loop=min(m,n)/2; //取m n的最小值 作为循环的次数
int offset=0;
int x=0,y=0;//开始遍历的坐标
// j--m i--n
while(loop--)
{
int i=x;
int j=y;
//左上方
//左闭右开
for(;j<m-1-offset;j++)
{
int t=matrix[i][j];
ans.push_back(t);
}
//右上方
//左闭右开
for(;i<n-1-offset;i++)
{
int t=matrix[i][j];
ans.push_back(t);
}
//左下方
//左闭右开
for(;j>offset;j--)
{
int t=matrix[i][j];
ans.push_back(t);
}
//左下方
//左闭右开
for(;i>offset;i--)
{
int t=matrix[i][j];
ans.push_back(t);
}
x++;
y++;
offset+=1;
}
//n比m先走完
if(m>n && n%2==1)
{
//往右遍历
for(int j=y,i=x;j<m-offset;j++)
{
int t=matrix[i][j];
ans.push_back(t);
}
}
else if(m<n && m%2==1)
{
//往下遍历
for(int j=y,i=x;i<n-offset;i++)
{
int t=matrix[i][j];
ans.push_back(t);
}
}
else if(m==n && n%2!=0)
{
int mid=n/2;
int t=matrix[mid][mid];
ans.push_back(t);
}
return ans;
}
};
总结
- 依旧是分成四个区域进行遍历
- 注意:
- 当m>n && n%2==1 或 m<n && m%2==1 时 ,即是对一行或一列进行遍历
- 此时,既包含了只有一行或者一列的情况,又包含了奇数行或奇数列的情况
这里的loop要取min(m,n)/2