题目描述
我的解法
思路
以矩阵中的元素个数作为遍历条件,根据螺旋的规律,每次循环中修改行、列对应的索引值,难点在于后一句,可以确定的是,这不想是按照一行一行的顺序,常规的两个循环是不行的,那么使用判断语句,交替继续行列看起来是可行的。
对应Java代码
class Solution {
public int[][] generateMatrix(int n) {
int circleNum = 0;
int num = 0;
int totalNum = n * n;
int[][] matrix = new int[n][n];
while (num <= totalNum) {
for (int stepIndex = 0; stepIndex < 4; stepIndex++){
if (num >= totalNum) {
return matrix;
}
switch (stepIndex) { //将一圈定义为4个不同的阶段
case 0:
for (int i = circleNum; i <= n - circleNum -1; i++){
matrix[circleNum][i] = ++num;
}
break;
case 1:
for (int i = circleNum + 1; i <= n - circleNum -1; i++){
matrix[i][n - circleNum - 1] = ++num;
}
break;
case 2:
for (int i = n - circleNum -2; i >= circleNum; i--){
matrix[n - circleNum -1][i] = ++num;
}
break;
case 3:
for (int i = n - circleNum -2; i >= circleNum + 1; i--){
matrix[i][circleNum] = ++num;
}
break;
}
}
circleNum++; //转了多少圈
}
return matrix;
}
}
感觉我这种解法并不涉及到什么算法,就是模拟了旋转的过程
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)
更优解法
此部分转载于公众号代码随想录
思路
额,大佬也说
「本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。」
结合自己在做题过程中提交反复出现的错误,就是边界条件。
而求解本题依然是要坚持循环不变量原则。模拟顺时针画矩阵的过程:填充上行从左到右填充右列从上到下填充下行从右到左填充左列从下到上由外向内一圈一圈这么画下去。可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是「一进循环深似海,从此offer是路人」。这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开又闭的原则,这样这一圈才能按照统一的规则画下来。
大佬这里举的例子的左闭右开
而我采用的相当于左闭右闭的方法
对应Java代码
略
复杂度分析
略
收获总结
这里主要总结下提交过程中出现的错误吧
1、使用了n作为数组的索引上限,导致溢出
2、循环过程中终止位置使用不当,导致运行超过时间限制和结果错误