841. Keys and Rooms

406 篇文章 0 订阅
406 篇文章 0 订阅

1,题目要求
There are N rooms and you start in room 0. Each room has a distinct number in 0, 1, 2, …, N-1, and each room may have some keys to access the next room.
Formally, each room i has a list of keys rooms[i], and each key rooms[i][j] is an integer in [0, 1, …, N-1] where N = rooms.length. A key rooms[i][j] = v opens the room with number v.
Initially, all the rooms start locked (except for room 0).
You can walk back and forth between rooms freely.
Return true if and only if you can enter every room.
这里写图片描述
对于由数组组成的房间每一个房间都有着表示其他房间的钥匙。也就是一个数字。判断是否可以从零号房间开始,依次到达所有的房间。

2,题目思路
对于这道题,我们是从0号的房间出发的,而每个房间内都有对应房间内的钥匙。我们所做的,就是看能否从0号房间到达所有的其他的房间。因此,我们需要至少找到一条符合条件的“路径”。
因此,对于这道题,我们需要一个有顺序的容器,用来记录这样的顺序;还需要另一个可去除重复元素的容器,来记录已经到达过的房间。
于是,定义一个stack来依次存储经过房间,定义一个set来存储到达过的房间(因为set可以自动的将重复的元素合并)。对于stack,每遍历一个房间,就pop出来一个。
room.size()就是房间的总数。而如果定义的set的大小等于room.size(),说明应到达课所有的房间。

3,程序源码

class Solution {
public:
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        stack<int> DFS;
        DFS.push(0);
        unordered_set<int> visited = {0};
        while(!DFS.empty())
        {
            int i = DFS.top();
            DFS.pop();
            for(auto j : rooms[i])
            {
                if(visited.count(j) == 0)   //没有到过这个房间中
                DFS.push(j);
                visited.insert(j);
                if(visited.size() == rooms.size())  return true;
            }
        }
        return visited.size() == rooms.size();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值