【LeetCode第59题】长舒一口气,终于学会了这苦涩难懂的 螺旋矩阵II

简介: 【LeetCode第59题】长舒一口气,终于学会了这苦涩难懂的 螺旋矩阵II

一、题目展示


题目要求:

image.png

示例1:

image.png

示例2:

image.png


二、整体思路分析

确定开闭原则:前闭后开

矩阵上行填入值从左到右

矩阵右侧填入值从上到下

矩阵下行填入值从右到左

矩阵左侧填入值从下到上

示意图:

image.png


写的时候,一定要坚持这些原则,不然的话,容易写乱,写糊涂。这道题不像是其它的算法题,它主要考的是模拟过程,没有涉及到什么算法,需要多些,多想。


三、提交代码

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

总结

这道力扣题主要学习到的是对自己写的代码的掌控力:填充的原则、开闭的原则等等,自己以后肯定会忘得,记得多练习,熟能生巧!!!



相关文章
|
8月前
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
50 0
|
9天前
leetcode54螺旋矩阵题解
leetcode54螺旋矩阵题解
10 2
|
18天前
|
算法 机器人 数据挖掘
LeetCode题目54:螺旋矩阵【python4种算法实现】
LeetCode题目54:螺旋矩阵【python4种算法实现】
|
8月前
|
机器学习/深度学习 算法
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
38 0
|
1月前
leetcode-6111:螺旋矩阵 IV
leetcode-6111:螺旋矩阵 IV
27 0
|
1月前
|
Java C++ Python
leetcode-59:螺旋矩阵 II
leetcode-59:螺旋矩阵 II
24 0
|
1月前
leetcode-54:螺旋矩阵
leetcode-54:螺旋矩阵
26 0
LeetCode刷题Day03——数组(滑动窗口+螺旋矩阵)
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。 滑动窗口也可以理解为双指针法的一种,只不过这种解法更像是一个窗口的移动。 实现滑动窗口,主要确定如下三点:
|
7月前
|
算法
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
44 0
|
12月前
|
算法 安全 Swift
LeetCode - #59 螺旋矩阵 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #59 螺旋矩阵 II