(1条消息) 一道题错过美团!

(我找图有点厉害)

今天是小浩算法 “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

题解分析

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

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

右-下-左-上

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

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

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

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

第一种填充方式的代码:

//javaclass 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;    }}

第二种填充方式的代码:

//javaclass 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

相似题目

(0)

相关推荐