Code Ganker: LeetCode总结 -- 矩阵篇

2014年9月12日星期五

LeetCode总结 -- 矩阵篇

矩阵(一般是二维数组)操作的题目在面试中考察基础coding的时候比较常见,一般来说不带有太多算法思想,纯粹就是二维数组下标的操作。虽然比较简单,不过还是比较能体现基本的实现能力。LeetCode中关于矩阵操作的题目有以下几个:
Spiral Matrix
Spiral Matrix II
Rotate Image
Valid Sudoku

前面三个题Spiral MatrixSpiral Matrix IIRotate Image思路比较类似,都是按照一定的规则在二维数组里面走下标。
Spiral Matrix就是按照螺旋的方式,按照右下左上的顺序,走到头就换方向。小技巧就是把这些螺旋分成层,然后知道区间照着走就可以。Spiral Matrix II也是一样的,不过是换成1到n^2的整数。
Rotate Image也是比较类似的,主要是想清楚每一个点经过旋转之后的下表位置,然后还是分成层,一层层进行旋转即可。

Valid Sudoku是让我们判断一个Sudoku的盘是否合法,对于行和列的判断应该比较简单,就是1到9不重复出现即可,有点技巧的是对于每个九宫格的合法性判断,这里需要稍微斟酌一下才可以把代码写得比较通用简洁一些,大家可以看看Valid Sudoku中的实现哈。

最后我们来说说比较有技巧的Set Matrix Zeroes这道题。它是一个非常常见的题目了,也是cc150中的题目。看似一个非常简单的题目,就是如果矩阵如果有元素为0,就把对应的行和列上面的元素都置为0,但是却有层层的优化方法。时间复杂度基本都是O(m*n),而空间复杂度却有很多可以优化的空间。最简单的思路是备份一个矩阵,然后照着原矩阵进行判断,有0则置对应列和行为0,这样空间是O(m*n)。而如果我们维护一个行和列的布尔数组,然后扫描一遍矩阵记录那一行或者列是不是应该置0,最后在进行一次赋值,这样时间复杂度不变,而空间复杂度只需要O(m+n)。再进一步优化,如果我们连布尔数组都不要,而用第一行和第一列来代替布尔数组,然后用两个变量来维护第一行和第一列的置0情况,这样就只需要O(1)的额外空间了。模型非常简单的一个题目,却有非常不同的答案,还是比较值得一考的题目哈。

这篇总结主要介绍了LeetCode中几个关于矩阵操作的题目,这种题目主要考点就是二维数组的下标操作,写代码的时候要思路清晰,才能保证bug free地实现。而有时候也会有像Set Matrix Zeroes这样模型比较简单,但是还是有一些考点的题目,大家还是要尽量考虑到最优解法。

没有评论:

发表评论