一、题目展示
题目要求:
示例1:
示例2:
二、整体思路分析
确定开闭原则:前闭后开
矩阵上行填入值从左到右
矩阵右侧填入值从上到下
矩阵下行填入值从右到左
矩阵左侧填入值从下到上
示意图:
写的时候,一定要坚持这些原则,不然的话,容易写乱,写糊涂。这道题不像是其它的算法题,它主要考的是模拟过程,没有涉及到什么算法,需要多些,多想。
三、提交代码
class Solution { public int[][] generateMatrix(int n) { //模拟矩阵 int[][] res = new int[n][n]; //这是每一圈的开始位置 int startX = 0; int startY = 0; //这是根据 n来决定圈数,当 n为奇数时,特别讨论 int loop = n / 2; //这是下面 while语句中的成员变量 int i; int j; //这是赋值用的1 2 3 4 等等 int count = 1; //这是用来决定开闭原则的偏移量 int setValue = 1; //开始赋值 while(loop > 0){ //把每一次遍历的开始,确定好位置 i = startX; j = startY; //上行从左到右,前开后闭依次赋值 for (;j < startY + n - setValue;j++){ res[startX][j] = count++; } //右侧从上到下,前开后闭依次赋值 //注意,这里的 j的值已经发生了改变,它是第一个for循环后的结果 for (;i < startX + n - setValue;i++){ res[i][j] = count++; } //下行从右到左,前开后闭依次赋值 for (;j > startY;j-- ){ res[i][j] = count++; } //左侧从上到下,前开后闭依次赋值 for (;i > startX;i--){ res[i][j] = count++; } loop--; startX++; startY++; setValue += 2; } //当n是奇数的时候,就有中间值 int mid = n / 2; //count也可以写成 n * n if ( n % 2 == 1) res[mid][mid] = count ; return res; } }
四、代码分析
易点分析
用二维数组模拟方阵
当 n是奇数的时候,就会有一个中间值,这个很容易理解,写的时候不要忘记了,我把它放在代码的最后部分
startX,startY 代表着每一完成后的起始位置。当n=4时,res[0][0]就是第一圈的起始位置;res[1][1]就是第二圈的起始位置,自己画图一下就可以看明白了
难点分析
偏移量setValue 的确定。因为遵守的是前闭后开的原则,所以第一圈上行从左到右侧时,在最右侧的前一个位置停下来,以n=4为例,即在res[0][2]的位置停下来。
setValue += 2 的问题。因为当第一圈结束后,会填满矩阵最左边和最右边的两个位置,为了避免再次出现填充过的位置,所以每一次的偏移量都要加2
总结
这道力扣题主要学习到的是对自己写的代码的掌控力:填充的原则、开闭的原则等等,自己以后肯定会忘得,记得多练习,熟能生巧!!!