-

螺旋矩阵Ⅱ(59)

今天是小浩算法 “365刷题计划” 第 108 天。为大家讲解 leetcode 第 59 题,是一道中等难度的题目。


大家也可以先看下该题的第一个版本:

螺旋矩阵Ⅰ(54)


本类题目在面试时出现的频率极高,尤其是对于工作年限在三年内的同学。因为该题非常考验 coding 能力,尤其是对边界条件的处理


很容易筛选面试者。

PNG


PNG

01、题目示例

做这道题之前,可以通过上面的链接做一下螺旋矩阵Ⅰ


第59题:螺旋矩阵Ⅱ
给定一个正整数 n,生成一个包含 1 到 n**2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。


示例:

  1. 输入: 3
  2. 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]


题目理解较为容易,给定 n = 3,那就生成一个 3^2 = 9 的矩阵。大家看下面的图可能更加直观一些:

PNG

02、题解分析

螺旋矩阵类的题目,思路基本都为模拟路径,难点都是考察边界的处理。虽然也有一些奇淫巧技,但万变不离其宗。


既然要模拟路径,先分析下路径是什么:


右-下-左-上


然后模拟向内环绕的过程,逐层填充:

PNG

这种方法其实有一个专业点的名字,叫做:蛇形填数


PNG


这里额外说一下,除了上面这种填充方式外,还有一种填充方式:

PNG

两者的区别,只是边界条件设定不同。


第一种填充方式的代码:

  1. //java
  2. class Solution {
  3. public int[][] generateMatrix(int n) {
  4. int[][] res = new int[n][n];
  5. for(int s = 0, e = n - 1, m = 1; s<=e ; s++,e--){
  6. for (int j = s; j <= e; j++) res[s][j] = m++;
  7. for (int i = s+1; i <= e; i++) res[i][e] = m++;
  8. for (int j = e-1; j >= s; j--) res[e][j] = m++;
  9. for (int i = e-1; i >= s+1; i--) res[i][s] = m++;
  10. }
  11. return res;
  12. }
  13. }

第二种填充方式的代码:

  1. //java
  2. class Solution {
  3. public int[][] generateMatrix(int n) {
  4. int[][] res = new int[n][n];
  5. for (int s = 0, e = n - 1, m = 1; s <= e; s++, e--) {
  6. if (s == e) res[s][e] = m++;
  7. for (int j = s; j <= e - 1; j++) res[s][j] = m++;
  8. for (int i = s; i <= e - 1; i++) res[i][e] = m++;
  9. for (int j = e; j >= s + 1; j--) res[e][j] = m++;
  10. for (int i = e; i >= s + 1; i--) res[i][s] = m++;
  11. }
  12. return res;
  13. }
  14. }

看完这两种解法,有没有 get✔ 到这道题目的核心呢?正是大量的边界操作,让这道题目成为了面试官的香饽饽。如果 coding 能力比较差,基本都会栽到这道题目上。


所以,非常建议基础较差的同学,认真练习一下上面的两种实现。


03、相似题目

然后这里我准备了几道同一类型的题目,建议大家刷一刷。完成之后可能会有一些不一样的思考。

螺旋矩阵Ⅰ(54)

旋转图像(48)

生命游戏(289)


今天的题目到这里就结束了,你学会了吗?快来评论区留下你的想法吧!