<
>

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

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

题目
841. 钥匙和房间

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

难度:中等
题目分析

1. 解法一:我自己想的,兜圈了……

class Solution:
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
# 基于栈的探索可以解决,反正就是一个个试
# 建立一个答案数组,没探索的标1,
# 等栈探索完,看答案数组的和是否为0,是可以走遍
if len(rooms) == 1:
return True # 一间房,肯定可以

ans =[1]*len(rooms) # 默认都是1,如果能进入,就标位0

my_stack = [] visited = set()

# 第一个房间进栈
if rooms[0] == []: # 没有钥匙
return False

ans[0] = 0
visited.add(0)
my_stack.append((0, 0)) # room_index, key_index

while my_stack:
room, i = my_stack.pop()
# 把能打开的门标记上
if rooms[room] == []: # 空房间不看
continue
for k in rooms[room]:
if ans[k] == 1: # 还没有钥匙
ans[k] = 0
if sum(ans) ==0: # 检查是否探索好
return True

#while i<len(rooms[room]) and rooms[room][i] == room: # 防止回到自身
# i += 1
# 前往下一个房间
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))

return sum(ans) == 0


1.1 运行结果:

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

1.2 分析:

在完成栈的问题时,我还没能从教材的迷宫模板中走出来,导致了这道题走了弯路。上述代码有超级多的冗余。

暂时禁止评论

微信扫一扫

易采站长站微信账号