C++:Leetcode-螺旋矩阵-59题螺旋矩阵
重点是循环不变性原则,把握住循环的一致性,同时理清每一次循环何为变量
然后按运行流程进行写代码。
本题考察对题目模拟过程的能力
题目
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
思路分析
重点:
1、循环不变量,每一条边的处理情况有统一一致,此代码采用左闭右开原则
2、一圈为一循环,手写一圈流程,将流程进行代码描述,知道何为循环变量
3、n*n的矩阵是循环n/2圈,每循环一圈起点(startX,startY)会发生改变,所以每一圈都要startX++,startY++;每循环一圈后圈也会变小,所以每一圈都要offset++,让圈变小
4、奇数矩阵,最后要对矩阵的最中间的位置进行赋值, nums[n / 2][n / 2] = count;
代码
/*
Leetcode-螺旋矩阵-59题
题目:
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
重点:
1、循环不变量,每一条边的处理情况有统一一致,此代码采用左闭右开原则
2、一圈为一循环,手写一圈流程,将流程进行代码描述,知道何为循环变量
*/
#include "iostream"
#include "vector"
using namespace std;
class Solution
{
public:
vector<vector<int>> generateMatrix(int n)
{
//起点(startX,startY)
//在遍历每一条边时,起点是变量
//一圈之后每一条边的大小改变,用offset来控制变量
int startX = 0;
int startY = 0;
int offset = 1;
//i代表行,j代表列
int i;
int j;
//赋值计数算子
int count = 1;
//存储螺旋矩阵
//结构等同二维数组
vector<vector<int>> nums(n, vector<int>(n, 0));
//n*n的矩阵,循环n/2圈
int loop = n / 2;
while (loop--)
{
i = startX;
j = startY;
//上行
//遵循左闭右开原则,只赋值第一个元素,不赋值最后一个元素
for (j = startY; j < n - offset; j++)
{
nums[startX][j] = count++;
}
//右列
for (i = startX; i < n - offset; i++)
{
nums[i][j] = count++;
}
//下行
for (; j > startY; j--)
{
nums[i][j] = count++;
}
//左列
for (; i > startX; i--)
{
nums[i][j] = count++;
}
//循环一圈后,起点变了,圈变小了所以offset变了
startX++;
startY++;
offset++;
}
//若n是奇数,将最后的值赋值给矩阵剩下最中间的位置
//最中间的位置为nums[n/2][n/2]
if (n % 2 == 1)
{
nums[n / 2][n / 2] = count;
}
return nums;
}
};
int main(int argc, char const *argv[])
{
Solution s1;
vector<vector<int>> nums;
nums = s1.generateMatrix(6);
//输出测试
for (vector<vector<int>>::iterator it = nums.begin(); it != nums.end(); it++)
{
for (vector<int>::iterator itt = it->begin(); itt != it->end(); itt++)
{
cout << *itt << "\t";
}
cout << endl;
}
return 0;
}
总结
熟悉了螺旋矩阵的题型,熟悉了循环不变量原则,抓住何为循环变量,何为循环不变量。
增加了模拟过程的熟悉。
参考代码随想录https://www.programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html#_59-%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5ii