iT邦幫忙

2026 iThome 鐵人賽

DAY 12
0
Software Development

30天刷完leetcoode75系列 第 12 篇

C++ 演算法練習 Day12|547, 841 題解與思路分享

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260926/201842655vNESofvAV.png

題目解析: 總共有n個房間,只有第0號房間沒鎖。每個房間裡會有一些其他房間的鑰匙,目標是判斷能不能成功打開並進入所有的房間
解題思路: 先設一個集合v記錄去過的房間,和一個佇列v1裝拿到鑰匙準備去開的房間。一開始先把0號房間塞進佇列,然後丟進迴圈開始跑。每次從佇列拿出一個房間,去過了就跳過,沒去過就加進集合,並把裡面的鑰匙全塞進佇列。最後檢查集合裡去過的房間數有沒有等於總房間數

class Solution {
public:
    bool canVisitAllRooms(vector>& rooms) {
        set v;
        queue v1;

        v1.push(0);

        while (!v1.empty()) {
            int n = v1.front();
            v1.pop();

            if (v.count(n)) continue;
            v.insert(n);

            for (int i = 0; i < rooms[n].size(); i++) {
                v1.push(rooms[n][i]);
            }
        }

        return v.size() == rooms.size();
    }
};

https://ithelp.ithome.com.tw/upload/images/20260926/20184265JV94p7hitF.png

題目解析: 給一個矩陣代表多個城市有沒有互相連接,如果有直接或間接相連的城市就會被當成同一個省份,找出總共有幾個省份
解題思路: 先設一個集合v記錄找過的城市,一個佇列v1找相連城市,和變數ans記錄省份數。接著丟進外層迴圈把每個城市看一遍,如果沒去過代表是新省份,把ans加1,並塞進佇列開始找關聯。內層迴圈會把有相連的城市全抓出來塞進佇列,一路把同省份的城市都標記起來,最後回傳ans

class Solution {
public:
    int findCircleNum(vector>& isConnected) {
        set v;
        queue v1;
        int ans = 0;

        for (int i = 0; i < isConnected.size(); i++) {
            if (v.count(i)) continue;

            ans++;
            v1.push(i);

            while (!v1.empty()) {
                int n = v1.front();
                v1.pop();

                if (v.count(n)) continue;
                v.insert(n);

                for (int j = 0; j < isConnected[n].size(); j++) {
                    if (isConnected[n][j] == 1) {
                        v1.push(j);
                    }
                }
            }
        }

        return ans;
    }
};

上一篇
C++ 演算法練習 Day11|746, 1137 題解與思路分享
下一篇
C++ 演算法練習 Day13|2095, 328, 206 題解與思路分享
系列文
30天刷完leetcoode75 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言