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

代碼隨想錄Day42-圖論:力扣第417m、841m、463e題

這篇具有很好參考價值的文章主要介紹了代碼隨想錄Day42-圖論:力扣第417m、841m、463e題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

417m. 太平洋大西洋水流問題

題目鏈接
代碼隨想錄文章講解鏈接

方法一:

用時:1h0m58s

思路

直接找哪些點既可以到達太平洋又可以到達大西洋比較麻煩,換個角度,找到太平洋可以逆流而上到達的點,再找到大西洋可以逆流而上到達的點,兩者的交集就是所需要的答案。
用兩個二維數(shù)組分別記錄太平洋和大西洋可以逆流而上達到的點,對邊界的點使用DFS。

  • 時間復雜度: O ( m ? n ) O(m \cdot n) O(m?n)
  • 空間復雜度: O ( m ? n ) O(m \cdot n) O(m?n)
C++代碼
class Solution {
private:
    int m;
    int n;

    void dfs(vector<vector<int>>& heights, vector<vector<bool>>& visited, int x, int y) {
        visited[x][y] = true;
        if (x - 1 >= 0 && !visited[x - 1][y] && heights[x - 1][y] >= heights[x][y]) dfs(heights, visited, x - 1, y);
        if (x + 1 < m && !visited[x + 1][y] && heights[x + 1][y] >= heights[x][y]) dfs(heights, visited, x + 1, y);
        if (y - 1 >= 0 && !visited[x][y - 1] && heights[x][y - 1] >= heights[x][y]) dfs(heights, visited, x, y - 1);
        if (y + 1 < n && !visited[x][y + 1] && heights[x][y + 1] >= heights[x][y]) dfs(heights, visited, x, y + 1);
    }
    
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        m = heights.size();
        n = heights[0].size();
        vector<vector<bool>> pacific(m, vector<bool>(n, false));
        vector<vector<bool>> atlantic(m, vector<bool>(n, false));
        vector<vector<int>> res;
        for (int i = 0; i < m; ++i) {
            if (!pacific[i][0]) dfs(heights, pacific, i, 0);
            if (!atlantic[i][n - 1]) dfs(heights, atlantic, i, n - 1);
        }
        for (int i = 0; i < n; ++i) {
            if (!pacific[0][i]) dfs(heights, pacific, 0, i);
            if (!atlantic[m - 1][i]) dfs(heights, atlantic, m - 1, i);
        }
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (pacific[i][j] && atlantic[i][j]) res.push_back({i, j});
            }
        }
        return res;
    }
};

方法二:BFS

用時:6m53s

思路
  • 時間復雜度: O ( m n ) O(mn) O(mn)
  • 空間復雜度: O ( m n ) O(mn) O(mn)。
C++代碼
class Solution {
private:
    int m;
    int n;
    int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};

    void bfs(vector<vector<int>>& heights, vector<vector<bool>>& visited, int x, int y) {
        queue<pair<int, int>> que;
        que.push(pair<int, int>(x, y));
        visited[x][y] = true;
        while (!que.empty()) {
            pair<int, int> tmp = que.front();
            que.pop();
            for (int i = 0; i < 4; ++i) {
                int nextx = tmp.first + dir[i][0];
                int nexty = tmp.second + dir[i][1];
                if (!(nextx < 0 || nextx >= m || nexty < 0 || nexty >= n) && !visited[nextx][nexty] && heights[nextx][nexty] >= heights[tmp.first][tmp.second]) {
                    visited[nextx][nexty] = true;
                    que.push(pair<int, int>(nextx, nexty));
                }
            }
        }
    }

public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        m = heights.size();
        n = heights[0].size();
        vector<vector<bool>> pacific(m, vector<bool>(n, false));
        vector<vector<bool>> atlantic(m, vector<bool>(n, false));
        vector<vector<int>> res;
        for (int i = 0; i < m; ++i) {
            if (!pacific[i][0]) bfs(heights, pacific, i, 0);
            if (!atlantic[i][n - 1]) bfs(heights, atlantic, i, n - 1);
        }
        for (int i = 0; i < n; ++i) {
            if (!pacific[0][i]) bfs(heights, pacific, 0, i);
            if (!atlantic[m - 1][i]) bfs(heights, atlantic, m - 1, i);
        }
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (pacific[i][j] && atlantic[i][j]) res.push_back({i, j});
            }
        }
        return res;
    }
};

看完講解的思考

逆流而上,真妙啊。

代碼實現(xiàn)遇到的問題

無。


841m. 鑰匙和房間

題目鏈接
代碼隨想錄文章講解鏈接

方法一:DFS

用時:12m21s

思路

DFS一遍,若有房間沒走過則返回false。

  • 時間復雜度: O ( n ) O(n) O(n)。
  • 空間復雜度: O ( n ) O(n) O(n)。
C++代碼
class Solution {
private:
    void dfs(vector<vector<int>>& rooms, vector<bool>& visited, int i) {
        visited[i] = true;
        for (int j = 0; j < rooms[i].size(); ++j) {
            if (!visited[rooms[i][j]]) dfs(rooms, visited, rooms[i][j]);
        }
    }

public:
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        vector<bool> visited(rooms.size(), false);
        dfs(rooms, visited, 0);
        for (int i = 0; i < rooms.size(); ++i) {
            if (!visited[i]) return false;
        }
        return true;
    }
};

方法二:BFS

用時:4m46s

思路
  • 時間復雜度: O ( n ) O(n) O(n)。
  • 空間復雜度: O ( n ) O(n) O(n)。
C++代碼
class Solution {
public:
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        vector<bool> visited(rooms.size(), false);
        queue<int> que;

        visited[0] = true;
        que.push(0);
        while (!que.empty()) {
            int curRoom = que.front();
            que.pop();
            for (int i = 0; i < rooms[curRoom].size(); ++i) {
                if (!visited[rooms[curRoom][i]]) {
                    visited[rooms[curRoom][i]] = true;
                    que.push(rooms[curRoom][i]);
                }
            }
        }
        for (int i = 1; i < rooms.size(); ++i) {
            if (!visited[i]) return false;
        }
        return true;
    }
};

看完講解的思考

無。

代碼實現(xiàn)遇到的問題

無。


463e. 島嶼的周長

題目鏈接
代碼隨想錄文章講解鏈接

方法一:DFS

用時:7m37s

思路

在DFS的過程中,某個方向到達邊界或者到達水域,則說明該方向是一條邊,周長+1。

  • 時間復雜度: O ( m n ) O(mn) O(mn)。
  • 空間復雜度: O ( m n ) O(mn) O(mn)。
C++代碼
class Solution {
private:
    int m;
    int n;
    int perimeter;

    void dfs(vector<vector<int>>& grid, int x, int y) {
        grid[x][y] = 2;
        if (x - 1 < 0 || grid[x - 1][y] == 0) ++perimeter;
        else if (grid[x - 1][y] != 2) dfs(grid, x - 1, y);
        if (x + 1 >= m || grid[x + 1][y] == 0) ++perimeter;
        else if (grid[x + 1][y] != 2) dfs(grid, x + 1, y);
        if (y - 1 < 0 || grid[x][y - 1] == 0) ++perimeter;
        else if (grid[x][y - 1] != 2) dfs(grid, x, y - 1);
        if (y + 1 >= n || grid[x][y + 1] == 0) ++perimeter;
        else if (grid[x][y + 1] != 2) dfs(grid, x, y + 1);
    }

public:
    int islandPerimeter(vector<vector<int>>& grid) {
        m = grid.size();
        n = grid[0].size();
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 1) {
                    dfs(grid, i, j);
                    return perimeter;
                }
            }
        }
        return perimeter;
    }
};

方法二:BFS

用時:4m55s

思路
  • 時間復雜度: O ( m n ) O(mn) O(mn)。
  • 空間復雜度: O ( m n ) O(mn) O(mn)。
C++代碼
class Solution {
private:
    int m;
    int n;
    int perimeter;
    int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};

    void bfs(vector<vector<int>>& grid, int x, int y) {
        queue<pair<int, int>> que;
        grid[x][y] = 2;
        que.push(pair<int, int>(x, y));
        while (!que.empty()) {
            pair<int, int> tmp = que.front();
            que.pop();
            for (int i = 0; i < 4; ++i) {
                int nextx = tmp.first + dir[i][0];
                int nexty = tmp.second + dir[i][1];
                if (nextx < 0 || nextx >= m || nexty < 0 || nexty >= n || grid[nextx][nexty] == 0) ++perimeter;
                else if (grid[nextx][nexty] != 2) {
                    grid[nextx][nexty] = 2;
                    que.push(pair<int, int>(nextx, nexty));
                }
            }
        }
    }

public:
    int islandPerimeter(vector<vector<int>>& grid) {
        m = grid.size();
        n = grid[0].size();
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 1) {
                    bfs(grid, i, j);
                    return perimeter;
                }
            }
        }
        return perimeter;
    }
};

方法三:遍歷

用時:7m11s

思路

其實直接遍歷就行了,遇到陸地就判斷一下四條邊,根本不用dfs、bfs這么復雜…

  • 時間復雜度: O ( m n ) O(mn) O(mn)
  • 空間復雜度: O ( 1 ) O(1) O(1)。
C++代碼
class Solution {
public:
    int islandPerimeter(vector<vector<int>>& grid) {
        int m = grid.size();
        int n = grid[0].size();
        int perimeter = 0;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 1) {
                    if (i - 1 < 0 || grid[i - 1][j] == 0) ++perimeter;
                    if (i + 1 >= m || grid[i + 1][j] == 0) ++perimeter;
                    if (j - 1 < 0 || grid[i][j - 1] == 0) ++perimeter;
                    if (j + 1 >= n || grid[i][j + 1] == 0) ++perimeter;
                }
            }
        }
        return perimeter;
    }
};

看完講解的思考

無。

代碼實現(xiàn)遇到的問題

無。


最后的碎碎念

一刷倒數(shù)第二天!文章來源地址http://www.zghlxwxcb.cn/news/detail-743900.html

到了這里,關(guān)于代碼隨想錄Day42-圖論:力扣第417m、841m、463e題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 代碼隨想錄 圖論

    代碼隨想錄 圖論

    目錄 797.所有可能得路徑? 200.島嶼數(shù)量 695.島嶼的最大面積 1020.飛地的數(shù)量? 130.被圍繞的區(qū)域? 417.太平洋大西洋水流問題? 827.最大人工島 127.單詞接龍? 841.鑰匙和房間 463.島嶼的周長? 797. 所有可能的路徑 中等 給你一個有? n ?個節(jié)點的? 有向無環(huán)圖(DAG) ,請你找出所有從

    2024年04月10日
    瀏覽(23)
  • 代碼隨想錄(番外)圖論1

    代碼隨想錄(番外)圖論1

    1. 深度優(yōu)先搜索理論基礎(chǔ) 2. 所有可能的路徑 3. 廣度優(yōu)先搜索理論基礎(chǔ).md https://programmercarl.com/%E5%9B%BE%E8%AE%BA%E6%B7%B1%E6%90%9C%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 1. 深度優(yōu)先搜索理論基礎(chǔ) 總結(jié) 同理回溯算法,換湯不換藥 二叉樹遞歸講解 (opens new window)中,給出了遞歸三部曲。 回溯算

    2024年04月28日
    瀏覽(22)
  • 代碼隨想錄(番外)圖論4

    417. 太平洋大西洋水流問題 那么我們可以 反過來想,從太平洋邊上的節(jié)點 逆流而上,將遍歷過的節(jié)點都標記上。 從大西洋的邊上節(jié)點 逆流而長,將遍歷過的節(jié)點也標記上。 然后兩方都標記過的節(jié)點就是既可以流太平洋也可以流大西洋的節(jié)點。 也就是說通過從兩邊的大洋開

    2024年04月29日
    瀏覽(15)
  • 代碼隨想錄Day58

    昨天因為志愿活動和筆試耽誤了一整天,今天繼續(xù)學習動規(guī)解決子序列問題。 給定字符串 s 和 t ,判斷 s 是否為 t 的子序列。 字符串的一個子序列是原始字符串刪除一些(也可以不刪除)字符而不改變剩余字符相對位置形成的新字符串。(例如,\\\"ace\\\"是\\\"abcde\\\"的一個子序列,

    2023年04月27日
    瀏覽(97)
  • 代碼隨想錄Day62

    今天繼續(xù)學習單調(diào)棧解決相關(guān)問題。 nums1?中數(shù)字?x?的 下一個更大元素 是指?x?在?nums2 中對應位置 右側(cè) 的 第一個 比?x?大的元素。 給你兩個 沒有重復元素 的數(shù)組?nums1 和?nums2 ,下標從 0 開始計數(shù),其中nums1?是?nums2?的子集。 對于每個 0 = i nums1.length ,找出滿足 nums1

    2024年02月01日
    瀏覽(100)
  • 代碼隨想錄Day50

    昨天因為準備面試所以咕咕了一天。今天繼續(xù)學習動規(guī)算法,盡管背包問題已經(jīng)結(jié)束但其中的各類思想仍需要進一步理解。 你是一個專業(yè)的小偷,計劃偷竊沿街的房屋。每間房內(nèi)都藏有一定的現(xiàn)金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統(tǒng),如果兩

    2023年04月14日
    瀏覽(93)
  • 代碼隨想錄day59

    647. 回文子串 給你一個字符串? s ?,請你統(tǒng)計并返回這個字符串中? 回文子串 ?的數(shù)目。 回文字符串 ?是正著讀和倒過來讀一樣的字符串。 子字符串 ?是字符串中的由連續(xù)字符組成的一個序列。 具有不同開始位置或結(jié)束位置的子串,即使是由相同的字符組成,也會被視作不

    2024年02月07日
    瀏覽(87)
  • 代碼隨想錄day44

    完全背包 其實就是每個物品可以使用無數(shù)次,給我們一個容器,裝滿這個容器的最大價值是多少。 思路: 如果求組合數(shù)就是外層for循環(huán)遍歷物品,內(nèi)層for遍歷背包。 如果求排列數(shù)就是外層for遍歷背包,內(nèi)層for循環(huán)遍歷物品。 完全背包的組合和排序 518. 零錢兌換 II 題目 給你

    2023年04月17日
    瀏覽(91)
  • 代碼隨想錄day01

    ● 思維不難,主要是考察對代碼的掌控能力 ● 內(nèi)存中的存儲方式:存放在連續(xù)內(nèi)存空間上的相同類型數(shù)據(jù)的集合 ● 數(shù)組可以通過下標索引獲取到下標對應的數(shù)據(jù) ● 數(shù)組下標從0開始 ● 因為內(nèi)存空間地址連續(xù),因此刪除或增加元素的時候,難免移動其他元素地址 ● Java中的

    2024年02月13日
    瀏覽(94)
  • 代碼隨想錄day02

    ● 力扣題目鏈接 ● 給你一個按 非遞減順序 排序的整數(shù)數(shù)組 nums,返回 每個數(shù)字的平方 組成的新數(shù)組,要求也按 非遞減順序 排序。 思路 ● 暴力排序,時間復雜度O(n + nlogn) ● 使用雙指針,時間復雜度O(n) 代碼 ● 力扣題目鏈接 ● 給定一個含有 n 個正整數(shù)的數(shù)組和一個正整

    2024年02月13日
    瀏覽(104)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包