题目来源
一道做智能的对话机器人公司的算法测试题
题目描述
有一个矩形的水槽被分为了 N * M 个格子,每个格子内的高度都不同,每个格子和直接相邻的格子相通(对角相邻的不相通)。从最左上角的格子注入水,水会向相通的较低的或同样高的格子流动,但不会流向较高的格子。请写程序计算水一共会流经多少个格子?
例如如果格子高度如下分布:
3 | 5 | 1 |
则水会从左上角流经 3、2、1 三个格子,答案为 3。
解题方案
思路
- 需要利用广度优先搜索(队列)的思路
- 将元素位置作为队列元素,而不使用元素值作为队列元素
- 将 [0, 0] 加入队列,依次遍历队列,将四周小于当前数值的元素加入队列,直到遍历完
3 | 5 | 1 |
3 |
5 | 5 | 1 |
5 |
- 时间复杂度:O(N^2)。N 为格子数量,因需要判断元素在队列中是否已经存在,所以需要跟其他元素比较
- 空间复杂度:O(N)。N 为格子数量,最长需要长度为 N 的额外队列
代码
class Solution: |
测试用例
[[3, 5, 1], [2, 1, 5], [4, 2, 1]] # input |
错误思路
- 直接遍历所有元素,如果当前值小于左上角、小于周围的值、周围的值小于左上角,则将结果加 1
class Solution: |