继续打卡算法题,今天学习的是LeetCode第59题螺旋矩阵 II,这道题目是道中等题
。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。
分析一波题目
本题没有算法理论,主要是靠模拟过程,怎么模拟是个问题,而且不能出乱?
按上图这样,一圈一圈模拟。
1、先模拟行
2、再模拟列
3、再模拟行
4、再模拟列
颜色一样的在一个行或者列模拟
,这里注意这里每个行或者列模拟的范围,遵循的规则是左边是闭的(包括),右边是开的(不包括)
。 需要注意如果n是奇数,那么最后一个元素需要单独处理。
本题解题技巧
1、模拟一圈一圈填充,需要注意每行和,每列的范围。
编码解决
class Solution {
public int[][] generateMatrix(int n) {
//思路 技巧 从外到內填充二维数据,优先从左往右->从上到下,从右到左,从下到上,循环n/2轮,数据就填充完成了
//如果是n是奇数,则数组最后一个数字需要单独填充
int result[][] = new int[n][n];
//定义循环次数,每一个循环,填充4个方向,也就是一圈,依次由内到外的填充,左开右闭的原则
int loop = n/2;
//待填充的数
int count=1;
//控制循环边界,每一轮需要减1
int offset = 1;
int startX = 0;
int startY = 0;
while(loop > 0) {
int x = startX;
int y = startY;
//从左往右遍历一行 n需要减少
for(; y<n-offset;y++) {
result[x][y] = count++;
}
//从上往下遍历一列
for(; x<n-offset;x++) {
result[x][y] = count++;
}
//从左往右遍历一列
for(; y>startY;y--) {
result[x][y] = count++;
}
//从下往上遍历一列
for(; x>startX;x--) {
result[x][y] = count++;
}
//填充完一圈 为下一圈做准备工作
startX++;
startY++;
offset++;
loop--;
}
if(n%2 ==1){
result[n/2][n/2] = count++;
}
return result;
}
}
总结
这种题目考虑思维的严谨性,没有算法理论,但是不能混乱,从外到內填充二维数据,优先从左往右->从上到下,从右到左,从下到上,循环n/2轮,数据就填充完成了。