Leetcode 第59题:螺旋矩阵 Ⅱ
解题思路:遵循一个循环不变量思想,即每层循环都是一条一条边的去填充,遵循左闭右开或者左开右闭的原则。如图所示:
填充时将每一行最后一个位置留出,把他算作下一条边,即每画一条边都要坚持一致的左闭右开,或者左开右闭。
解题代码如下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> array(n,vector<int>(n,0));//定义二维数组
//填充时将每一行最后一个位置留出,把他算作下一条边
/*
即每画一条边都要坚持一致的左闭右开,或者左开右闭
*/
int startx = 0,starty = 0;//循环的起始位置
int circle = n/2;//计算循环几圈
int mid = n/2;//矩阵中心位置
int count = 1;//从1开始填充
int side = 1;//边界控制变量(此算法中为1,即每条边最后一个算作下一条边的填充)
int i , j;
while (circle)
{
//从起始位置开始
i = startx;
j = starty;
for (j = starty; j < n - side; j++)//第一条横边
{
array[startx][j] = count++;
}
for (i = startx; i < n - side; i++)//第一条竖边
{
array[i][j] = count++;
}
for (; j > starty; j--)//第二条横边
{
array[i][j] = count++;
}
for (; i > startx; i--)//第二条竖边
{
array[i][j] = count++;
}
//每层循环的四条边遍历结束
//第一次循环结束,重新设置起始点位
startx += 1;
starty += 1;
circle -= 1;
//每循环一圈,每行需要留的空位置就增一个
side += 1;
}
//奇数行中间会留出单独一个位置
if (n % 2 != 0)
array[mid][mid] = count;
return array;
}
};
Leetcode 第54题:螺旋矩阵
解题思路:与上一题的区别在于,这个矩阵不是n*n型,那么关键在于循环要走几次的问题,列出两个不同类型矩阵:
可以看出需要循环的次数=矩阵最短边/2,其他部分与上面雷同。完整实现代码如下:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector <int> array;
//设置起始位置
int startx = 0,starty = 0;
//求数组的行数和列数
int m = matrix.size();//行
int n = matrix[0].size();//列
int circle;
//哪条边短哪条边决定循环次数
if (m<=n)
circle = m/2;
else
circle = n/2;
int side = 1;
int i,j;
while(circle)
{
i = startx;
j = starty;
for (j = starty; j< n-side; j++)
{
array.push_back(matrix[startx][j]);
}
for (i = startx; i < m-side; i++)
{
array.push_back(matrix[i][j]);
}
for (; j > starty; j--)
{
array.push_back(matrix[i][j]);
}
for (; i > startx; i--)
{
array.push_back(matrix[i][j]);
}
//更新起始点位
startx += 1;
starty += 1;
circle -= 1;
//每循环一次,边界增1
side += 1;
}
//奇数行会有中间位置没循环到
if(m<=n && m%2 != 0)
{
for(j = starty; j <= n-side; j++)
{
array.push_back(matrix[startx][j]);
}
}
if (m > n && n%2 != 0)
{
for (i = startx ; i <= m - side; i++)
{
array.push_back(matrix[i][starty]);
}
}
return array;
}
};
剑指offer第29题:顺时针打印矩阵
解题思路与54题一致,代码可以直接用,注意判断输入数组是否为空,判断与语句如下:
if (matrix.size() == 0)
{
return {};
}