【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

总结

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



相关文章
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
【Leetcode -2181.合并零之间的节点- 2326.螺旋矩阵Ⅳ】
79 0
|
2月前
|
C++
Leetcode第54题(螺旋矩阵)
这篇文章介绍了LeetCode第54题“螺旋矩阵”的解题思路和C++的实现代码,该题目要求按照顺时针螺旋顺序返回给定矩阵中的所有元素。
23 1
Leetcode第54题(螺旋矩阵)
|
2月前
【LeetCode 05】螺旋矩阵II总结
【LeetCode 05】螺旋矩阵II总结
25 0
|
4月前
|
算法
LeetCode第59题螺旋矩阵 II
LeetCode第59题"螺旋矩阵 II"的解题方法,通过模拟螺旋填充过程,一圈一圈从外到内按顺序填充数字,直到完成整个矩阵的构建。
LeetCode第59题螺旋矩阵 II
|
4月前
|
存储 算法
LeetCode第54题螺旋矩阵
LeetCode第54题"螺旋矩阵"的解题方法,通过模拟从外到内的螺旋遍历过程,并利用方向向量控制遍历方向的转换,有效输出矩阵的螺旋顺序。
LeetCode第54题螺旋矩阵
|
机器学习/深度学习 算法
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
59 0
|
6月前
leetcode54螺旋矩阵题解
leetcode54螺旋矩阵题解
35 2
|
6月前
|
算法 机器人 数据挖掘
LeetCode题目54:螺旋矩阵【python4种算法实现】
LeetCode题目54:螺旋矩阵【python4种算法实现】
|
6月前
|
存储 算法
力扣经典150题第三十五题:螺旋矩阵
力扣经典150题第三十五题:螺旋矩阵
28 0
|
7月前
leetcode-6111:螺旋矩阵 IV
leetcode-6111:螺旋矩阵 IV
48 0