<
>

Leetcode刷题(18)栈的应用:钥匙和房间 (深度分析堆栈使用的易

2020-06-28 12:37:30 来源:易采站长站 作者:易采站长站整理


以下是各个冗余点:

 if rooms[room] == []: # 空房间不看
continue
for k in rooms[room]:
if ans[k] == 1: # 还没有钥匙
ans[k] = 0

不需要判断表是不是空,因为表空的话,下面的for循环不会运行,会自己跳过

然后,这里我再标记哪些房间可以探索的时候,就可以把他们加入栈里面待探索!然后,整个程序到这里就可以结束了……因此,下面这段代码都是多余的!

# 前往下一个房间
while i < len(rooms[room]) and rooms[room][i] in visited:
i += 1
if i == len(rooms[room]):
continue # 这里就没什么可以探索的了
nxt = rooms[room][i] # 要进入下个房间
visited.add(nxt)
# 未探索的进栈
if i+1 < len(rooms[room]):
my_stack.append((room, i+1))
my_stack.append((nxt, 0))

这段代码,我的本意是探索哪些钥匙要加入待探索的栈中,于是,进行了一大堆判断,然而,这部分工作,在前面的代码中已经完成了,这里的i并没有作用,上面的for循环,已经覆盖了。

同时,我这个代码,不需要set()也能求解

1.3 代码修正

class Solution:
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
ans =[1]*len(rooms) # 默认都是1,如果能进入,就标位0
my_stack = []

ans[0] = 0
my_stack.append(0) # room_index

while my_stack:
room = my_stack.pop()
# 把能打开的门标记上

for k in rooms[room]: # 包括空
if ans[k] == 1: # 还没有钥匙
ans[k] = 0
my_stack.append(k)

return sum(ans) == 0


1.3.1 运行结果:

在这里插入图片描述
在这里插入图片描述

1.3.2 分析:

运行速度快了点,不过不稳定,理论上,使用数组索引,不应该把set()慢呀!
跟解法二的区别就是用不同方式记录探索过的房间。

2. 解法二:不兜圈子的解法

# 参考了最快答案后的解法
class Solution:
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
my_stack = [] # 用来存储待探索的房间
暂时禁止评论

微信扫一扫

易采站长站微信账号