国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

(圖論) 841. 鑰匙和房間 ——【Leetcode每日一題】

這篇具有很好參考價(jià)值的文章主要介紹了(圖論) 841. 鑰匙和房間 ——【Leetcode每日一題】。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

? 841. 鑰匙和房間

難度:中等

n 個(gè)房間,房間按從 0n - 1 編號。最初,除 0 號房間外的其余所有房間都被鎖住。你的目標(biāo)是進(jìn)入所有的房間。然而,你不能在沒有獲得鑰匙的時(shí)候進(jìn)入鎖住的房間。

當(dāng)你進(jìn)入一個(gè)房間,你可能會在里面找到一套不同的鑰匙,每把鑰匙上都有對應(yīng)的房間號,即表示鑰匙可以打開的房間。你可以拿上所有鑰匙去解鎖其他房間。

給你一個(gè)數(shù)組 rooms 其中 rooms[i] 是你進(jìn)入 i 號房間可以獲得的鑰匙集合。如果能進(jìn)入 所有 房間返回 true,否則返回 false。

示例 1:

輸入:rooms = [[1],[2],[3],[]]
輸出:true
解釋:
我們從 0 號房間開始,拿到鑰匙 1。
之后我們?nèi)?1 號房間,拿到鑰匙 2。
然后我們?nèi)?2 號房間,拿到鑰匙 3。
最后我們?nèi)チ?3 號房間。
由于我們能夠進(jìn)入每個(gè)房間,我們返回 true。

示例 2:

輸入:rooms = [[1,3],[3,0,1],[2],[0]]
輸出:false
解釋:我們不能進(jìn)入 2 號房間。

提示

  • n = = r o o m s . l e n g t h n == rooms.length n==rooms.length
  • 2 < = n < = 1000 2 <= n <= 1000 2<=n<=1000
  • 0 < = r o o m s [ i ] . l e n g t h < = 1000 0 <= rooms[i].length <= 1000 0<=rooms[i].length<=1000
  • 1 < = s u m ( r o o m s [ i ] . l e n g t h ) < = 3000 1 <= sum(rooms[i].length) <= 3000 1<=sum(rooms[i].length)<=3000
  • 0 < = r o o m s [ i ] [ j ] < n 0 <= rooms[i][j] < n 0<=rooms[i][j]<n
    所有 r o o m s [ i ] rooms[i] rooms[i] 的值 互不相同

??思路:

可以將每個(gè)房間當(dāng)作圖中的結(jié)點(diǎn),鑰匙當(dāng)作圖中的邊,只要所有結(jié)點(diǎn)能夠連通,則返回true;

法一:BFS

數(shù)組 rooms 的長度即為 房間的總個(gè)數(shù):(bfs)

  • 可以設(shè)置一個(gè)數(shù)組 open,記錄是否找到鑰匙;
  • 以及一個(gè)隊(duì)列 keys,存儲在每個(gè)房間取得的鑰匙;
  • 再另設(shè)一個(gè)變量 count 記錄已打開房間的個(gè)數(shù),最后只需比較 count 是否等于房間的總個(gè)數(shù)。

法二:DFS

我們可以使用深度優(yōu)先搜索的方式遍歷整張圖,

統(tǒng)計(jì)可以到達(dá)的節(jié)點(diǎn)個(gè)數(shù),并利用數(shù)組 open 標(biāo)記當(dāng)前節(jié)點(diǎn)是否訪問過,以防止重復(fù)訪問。

??代碼:(C++、Java)

法一:BFS
C++

class Solution {
public:
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        queue<int> keys;
        vector<int> open(rooms.size());
        open[0] = 1;
        int count = 1;
        for(int k : rooms[0]){
            keys.push(k);
        }
        while(!keys.empty()){
            int key = keys.front();
            keys.pop();
            if(open[key] == 0){
                for(int k : rooms[key]){
                    keys.push(k);
                }
                open[key] = 1;
                count++;
            }
        }
        return count == rooms.size();
    }
};

Java

class Solution {
    public boolean canVisitAllRooms(List<List<Integer>> rooms) {
        Queue<Integer> keys = new LinkedList();
        int[] open = new int[rooms.size()];
        open[0] = 1;
        int count = 1;
        for(int k : rooms.get(0)){
            keys.offer(k);
        }
        while(!keys.isEmpty()){
            int key = keys.poll();
            if(open[key] == 0){
                for(int k : rooms.get(key)){
                    keys.offer(k);
                }
                open[key] = 1;
                count++;
            }
        }
        return count == rooms.size();
    }
}

法二:DFS
C++

class Solution {
private:
    void dfs(const vector<vector<int>>& rooms, int key, vector<int>& open){
        if(open[key] == 1) return;
        open[key] = 1;
        for(int k : rooms[key]){
            dfs(rooms, k, open);
        }
    }
public:
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        vector<int> open(rooms.size());
        dfs(rooms, 0, open);
        for(int p : open){
            if(p == 0) return false;
        }
        return true;
    }
};

Java

class Solution {
    private void dfs(List<List<Integer>> rooms, int key, int[] open){
        if(open[key] == 1) return;
        open[key] = 1;
        for(int k : rooms.get(key)){
            dfs(rooms, k, open);
        }
    }
    public boolean canVisitAllRooms(List<List<Integer>> rooms) {
        int[] open = new int[rooms.size()];
        dfs(rooms, 0, open);
        for(int p : open){
            if(p == 0) return false;
        }
        return true;
    }
}
?? 運(yùn)行結(jié)果:

(圖論) 841. 鑰匙和房間 ——【Leetcode每日一題】,LeetCode,圖論,leetcode,算法

?? 復(fù)雜度分析:
  • 時(shí)間復(fù)雜度 O ( n + m ) O(n + m) O(n+m),其中 n 為房間的數(shù)量,m 是所有房間中的鑰匙數(shù)量的總數(shù)。
  • 空間復(fù)雜度 O ( n ) O(n) O(n),主要為隊(duì)列(bfs)或棧空間(dfs)的開銷。

題目來源:力扣。

放棄一件事很容易,每天能堅(jiān)持一件事一定很酷,一起每日一題吧!
關(guān)注我LeetCode主頁 / CSDN—力扣專欄,每日更新!文章來源地址http://www.zghlxwxcb.cn/news/detail-566160.html

注: 如有不足,歡迎指正!

到了這里,關(guān)于(圖論) 841. 鑰匙和房間 ——【Leetcode每日一題】的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Leetcode每日一題——“移除元素”

    Leetcode每日一題——“移除元素”

    各位CSDN的uu們你們好呀,小雅蘭又來啦,今天,小雅蘭的內(nèi)容是移除元素,下面,讓我們進(jìn)入Leetcode的世界吧 ? 說明: 為什么返回?cái)?shù)值是整數(shù),但輸出的答案是數(shù)組呢? 請注意,輸入數(shù)組是以「引用」方式傳遞的,這意味著在函數(shù)里修改輸入數(shù)組對于調(diào)用者是可見的。 你可以

    2023年04月23日
    瀏覽(17)
  • 【LeetCode】每日一題:移除元素

    【LeetCode】每日一題:移除元素

    目錄 ?題目: 思想1:暴力解法 思想2:創(chuàng)建一個(gè)temp數(shù)組? 思想3:雙指針 ??內(nèi)容專欄:《LeetCode刷題專欄》 ??本文概括: 27.移除元素 ??本文作者:花 碟 ??發(fā)布時(shí)間:2023.4.15 https://leetcode.cn/problems/remove-element/? ?點(diǎn)擊跳轉(zhuǎn)到LeetCode平臺OJ頁面(27.移除元素) ??? 示例1: 解

    2023年04月19日
    瀏覽(23)
  • 【每日一題】Leetcode - 283. 移動零

    【每日一題】Leetcode - 283. 移動零

    Leetcode - 283. 移動零 從右向左遍歷,遇到0,就將后面所有元素前移,同時(shí)更新長度,使其減1,因?yàn)橐苿觧次,倒數(shù)n位就被0占據(jù),后續(xù)操作可忽略 前面的操作,從右向左,每次遇到0移動都要跑半個(gè)數(shù)組,慢在整體前移; 換個(gè)思路,從左向右,記錄首個(gè)0的位置,將后面的第一

    2024年02月11日
    瀏覽(14)
  • 【LeetCode每日一題】——575.分糖果

    【LeetCode每日一題】——575.分糖果

    哈希表 簡單 575.分糖果 Alice 有 n 枚糖,其中第 i 枚糖的類型為 candyType[i] 。Alice 注意到她的體重正在增長,所以前去拜訪了一位醫(yī)生。 醫(yī)生建議 Alice 要少攝入糖分,只吃掉她所有糖的 n / 2 即可(n 是一個(gè)偶數(shù))。Alice 非常喜歡這些糖,她想要在遵循醫(yī)生建議的情況下,盡可

    2024年02月13日
    瀏覽(28)
  • LeetCode每日一題之 復(fù)寫0

    LeetCode每日一題之 復(fù)寫0

    目錄 題目介紹: 算法原理: 特殊位置處理: 代碼實(shí)現(xiàn): 題目鏈接:. - 力扣(LeetCode) 這種對數(shù)組元素進(jìn)行修改,移動的題目我們?nèi)匀豢梢允褂秒p指針法,不過我們按照常規(guī)思路從左到右處理數(shù)組,不難發(fā)現(xiàn)如下這種問題: 當(dāng)cur指向1時(shí),讓dest下一個(gè)元素復(fù)寫cur指向的元素

    2024年04月23日
    瀏覽(26)
  • 每日一題(LeetCode)----二分查找(一)

    給定一個(gè)排序數(shù)組和一個(gè)目標(biāo)值,在數(shù)組中找到目標(biāo)值,并返回其索引。如果目標(biāo)值不存在于數(shù)組中,返回它將會被按順序插入的位置。 請必須使用時(shí)間復(fù)雜度為 O(log n) 的算法。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 104 -104 = nums[i] = 104 nums 為 無重復(fù)元素 的 升序 排列數(shù)

    2024年02月08日
    瀏覽(25)
  • 【LeetCode每日一題】——566.重塑矩陣

    【LeetCode每日一題】——566.重塑矩陣

    矩陣 簡單 566.重塑矩陣 在 MATLAB 中,有一個(gè)非常有用的函數(shù) reshape ,它可以將一個(gè) m x n 矩陣重塑為另一個(gè)大小不同(r x c)的新矩陣,但保留其原始數(shù)據(jù)。 給你一個(gè)由二維數(shù)組 mat 表示的 m x n 矩陣,以及兩個(gè)正整數(shù) r 和 c ,分別表示想要的重構(gòu)的矩陣的行數(shù)和列數(shù)。 重構(gòu)后

    2024年02月14日
    瀏覽(19)
  • leetcode每日一題:62. 不同路徑

    leetcode每日一題:62. 不同路徑

    系列:動態(tài)規(guī)劃 語言:java 難度:中等 題目來源:Leetcode62. 不同路徑 開啟動態(tài)規(guī)劃章節(jié)了!!歡迎您在留言和我一起完成每日打卡,以后每天8點(diǎn)半前發(fā)布每日一題。 原題鏈接:Leetcode62. 不同路徑 一個(gè)機(jī)器人位于一個(gè) m x n 網(wǎng)格的左上角 (起始點(diǎn)在下圖中標(biāo)記為 “Start” )

    2023年04月22日
    瀏覽(20)
  • 每日一題:leetcode 57 插入?yún)^(qū)間

    給你一個(gè) ?無重疊的 ?, 按照區(qū)間起始端點(diǎn)排序的區(qū)間列表。 在列表中插入一個(gè)新的區(qū)間,你需要確保列表中的區(qū)間仍然有序且不重疊(如果有必要的話,可以合并區(qū)間)。 示例 1: 示例 2: 示例 3: 示例 4: 示例 5: 提示: 0 = intervals.length = 104 intervals[i].length == 2 0 = int

    2024年02月11日
    瀏覽(22)
  • 【LeetCode每日一題】——85.最大矩形

    【LeetCode每日一題】——85.最大矩形

    矩陣 困難 85.最大矩形 給定一個(gè)僅包含 0 和 1 、大小為 rows x cols 的二維二進(jìn)制矩陣,找出只包含 1 的最大矩形,并返回其面積。 示例 1: 輸入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“

    2024年02月13日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包