(我找图有点厉害)
今天是小浩算法 “365刷题计划” 第 108 天。为大家讲解 leetcode 第 59 题,是一道中等难度的题目。
大家也可以先看下该题的第一个版本:
漫画:一文看懂螺旋矩阵求解
本类题目在面试时出现的频率极高,尤其是对于工作年限在三年内的同学。因为该题非常考验 coding 能力,尤其是对边界条件的处理。
很容易筛选面试者。
进刷题群的小伙伴
关注回复【进群】即可
01
PART
螺旋矩阵2⃣️
做这道题之前,可以通过上面的链接做一下螺旋矩阵 1⃣️。
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
输入: 3
输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
题目理解较为容易,给定 n = 3,那就生成一个 3^2 = 9 的矩阵。大家看下面的图可能更加直观一些:
02
PART
题解分析
螺旋矩阵类的题目,思路基本都为模拟路径,难点都是考察边界的处理。虽然也有一些奇淫巧技,但万变不离其宗。
既然要模拟路径,先分析下路径是什么:
右-下-左-上
然后模拟向内环绕的过程,逐层填充:
这种方法其实有一个专业点的名字,叫做:蛇形填数
这里额外说一下,除了上面这种填充方式外,还有一种填充方式:
两者的区别,只是边界条件设定不同。
第一种填充方式的代码:
//java class Solution { public int[][] generateMatrix(int n) { int[][] res = new int[n][n]; for(int s = 0, e = n - 1, m = 1; s<=e ; s++,e--){ for (int j = s; j <= e; j++) res[s][j] = m++; for (int i = s+1; i <= e; i++) res[i][e] = m++; for (int j = e-1; j >= s; j--) res[e][j] = m++; for (int i = e-1; i >= s+1; i--) res[i][s] = m++; } return res; } }第二种填充方式的代码:
//java class Solution { public int[][] generateMatrix(int n) { int[][] res = new int[n][n]; for (int s = 0, e = n - 1, m = 1; s <= e; s++, e--) { if (s == e) res[s][e] = m++; for (int j = s; j <= e - 1; j++) res[s][j] = m++; for (int i = s; i <= e - 1; i++) res[i][e] = m++; for (int j = e; j >= s + 1; j--) res[e][j] = m++; for (int i = e; i >= s + 1; i--) res[i][s] = m++; } return res; } }看完这两种解法,有没有 get✔ 到这道题目的核心呢?正是大量的边界操作,让这道题目成为了面试官的香饽饽。如果 coding 能力比较差,基本都会栽到这道题目上。
所以,非常建议基础较差的同学,认真练习一下上面的两种实现。
03
PART
相似题目
然后这里我准备了几道同一类型的题目,建议大家刷一刷。完成之后可能会有一些不一样的思考。
螺旋矩阵(基本)
旋转图像(滴滴)
生命游戏(头条、Google 面试题)
如果你也想加入我们每日刷题
扫码,回复【进群】就可以啦。
也可以直接登录网站学习!
https://www.geekxh.com
推荐几篇必看文章:
漫画:小白为了面试如何刷题?(呕心沥血算法指导篇)
漫画:呕心泣血算法指导篇(真正的干货,怒怼那些说算法没用的人)
动态规划入门看这篇就够了,万字长文!
万字长文!位运算面试看这篇就够了!
大家帮我多转发,我帮大家多写题解~奥利给!