LeetCode 54 螺旋矩阵

先贴代码

java 复制代码
​
class Solution {
    public int[][] generateMatrix(int n) {
        int left = 0;
        int right = n-1;
        int up = 0;
        int down = n-1;
        int[][] result = new int[n][n];
        int number = 0;
        while(left <= right && up <= down) {
            for(int i=left;i<=right;i++) {
                number++;
                result[up][i] = number;
            }
            up++;
            for(int i=up;i<=down;i++) {
                number++;
                result[i][right] = number;
            }
            right--;
            for(int i=right;i>=left;i--) {
                number++;
                result[down][i] = number;
            }
            down--;
            for(int i=down;i>=up;i--) {
                number++;
                result[i][left] = number;
            }
            left++;

        }
        return result;
    }
}

​

我其实不止一次做过这道题,巧的是前面几次做完就忘记了..其实编程题真的应该自己去做,而不是看答案,那样太容易遗忘。并且一个很好用的方法是画示意图,把一些变量的变化过程给标记出来。

螺旋矩阵重在矩阵的切割,你是如何给矩阵分块以及上下左右的索引的增减。

1、矩阵分块

以三阶矩阵为例,

|---|---|---|
| 1 | 2 | 3 |
| 8 | 9 | 4 |
| 7 | 6 | 5 |

我们可以以1、2为块,然后以3、4为块,5、6为块,7,8为块,9为块

我使用的是以1、2、3为块,4,5为块,6、7为块,8为块,9为块

每次块结束后需要对索引值进行增减(以1、2为块似乎不用每次进行上下左右索引的增减,只需要在每次一圈结束后增加一个索引即可)

2、索引增减

首先设置left=0;right=n-1;up=0;down=n-1;

第一阶段从左到右,结束后对上索引加一(从左到右是i++)

第二阶段从上到下,结束后对右索引减一(从上到下是i++)

第三阶段从右到左,结束后对下索引减一(从右到左是i--)

第四阶段从下到上,结束后对左索引加一(从下到上是i--)

其实一个非常巧合的规律是,上一个阶段的索引加减刚好是下一个阶段的开始方向

最后我们可以定义退出循环的条件是

1、left <= right && up <= down

2、number <= n * n

1或者2都是可行的

相关推荐
栀秋66610 分钟前
深入浅出链表操作:从Dummy节点到快慢指针的实战精要
前端·javascript·算法
Pyeako23 分钟前
机器学习之KNN算法
人工智能·算法·机器学习
xhxxx28 分钟前
从被追问到被点赞:我靠“哨兵+快慢指针”展示了面试官真正想看的代码思维
javascript·算法·面试
可信计算31 分钟前
【算法随想】一种基于“视觉表征图”拓扑变化的NLP序列预测新范式
人工智能·笔记·python·算法·自然语言处理
月明长歌38 分钟前
【码道初阶】【LeetCode 110】平衡二叉树:如何用一个“Magic Number”将复杂度从O(N²)降为 O(N)?
linux·算法·leetcode
yaoh.wang41 分钟前
力扣(LeetCode) 14: 最长公共前缀 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
Tipriest_1 小时前
旋转矩阵与欧拉角转换数学公式与代码详解
线性代数·矩阵
历程里程碑1 小时前
C++ 9 stack_queue:数据结构的核心奥秘
java·开发语言·数据结构·c++·windows·笔记·算法
t198751281 小时前
基于MATLAB的线性判别分析(LDA)降维算法实现方案
开发语言·算法·matlab
仰泳的熊猫1 小时前
1108 Finding Average
数据结构·c++·算法·pat考试