最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)LeetCode(200.島嶼的數(shù)量)

 更新時間:2021年07月27日 15:36:03   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)LeetCode(200.島嶼的數(shù)量),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下

[LeetCode] 200. Number of Islands 島嶼的數(shù)量

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example 1:

Input:
11110
11010
11000
00000

Output: 1

Example 2:

Input:
11000
11000
00100
00011

Output: 3

這道求島嶼數(shù)量的題的本質是求矩陣中連續(xù)區(qū)域的個數(shù),很容易想到需要用深度優(yōu)先搜索 DFS 來解,我們需要建立一個 visited 數(shù)組用來記錄某個位置是否被訪問過,對于一個為 ‘1' 且未被訪問過的位置,遞歸進入其上下左右位置上為 ‘1' 的數(shù),將其 visited 對應值賦為 true,繼續(xù)進入其所有相連的鄰位置,這樣可以將這個連通區(qū)域所有的數(shù)找出來,并將其對應的 visited 中的值賦 true,找完相鄰區(qū)域后,將結果 res 自增1,然后再繼續(xù)找下一個為 ‘1' 且未被訪問過的位置,以此類推直至遍歷完整個原數(shù)組即可得到最終結果,代碼如下:

解法一:

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        if (grid.empty() || grid[0].empty()) return 0;
        int m = grid.size(), n = grid[0].size(), res = 0;
        vector<vector<bool>> visited(m, vector<bool>(n));
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == '0' || visited[i][j]) continue;
                helper(grid, visited, i, j);
                ++res;
            }
        }
        return res;
    }
    void helper(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {
        if (x < 0 || x >= grid.size() || y < 0 || y >= grid[0].size() || grid[x][y] == '0' || visited[x][y]) return;
        visited[x][y] = true;
        helper(grid, visited, x - 1, y);
        helper(grid, visited, x + 1, y);
        helper(grid, visited, x, y - 1);
        helper(grid, visited, x, y + 1);
    }
};

當然,這種類似迷宮遍歷的題目 DFS 和 BFS 兩對好基友肯定是形影不離的,那么 BFS 搞起。其實也很簡單,就是在遍歷到 ‘1' 的時候,且該位置沒有被訪問過,那么就調用一個 BFS 即可,借助隊列 queue 來實現(xiàn),現(xiàn)將當前位置加入隊列,然后進行 while 循環(huán),將隊首元素提取出來,并遍歷其周圍四個位置,若沒有越界的話,就將 visited 中該鄰居位置標記為 true,并將其加入隊列中等待下次遍歷即可,參見代碼如下:

解法二:

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        if (grid.empty() || grid[0].empty()) return 0;
        int m = grid.size(), n = grid[0].size(), res = 0;
        vector<vector<bool>> visited(m, vector<bool>(n));
        vector<int> dirX{-1, 0, 1, 0}, dirY{0, 1, 0, -1};
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == '0' || visited[i][j]) continue;
                ++res;
                queue<int> q{{i * n + j}};
                while (!q.empty()) {
                    int t = q.front(); q.pop();
                    for (int k = 0; k < 4; ++k) {
                        int x = t / n + dirX[k], y = t % n + dirY[k];
                        if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == '0' || visited[x][y]) continue;
                        visited[x][y] = true;
                        q.push(x * n + y);
                    }
                }
            }
        }
        return res;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/200

類似題目:

Number of Islands II

Surrounded Regions

Walls and Gates

Number of Connected Components in an Undirected Graph 

Number of Distinct Islands 

Max Area of Island

參考資料:

https://leetcode.com/problems/number-of-islands/

https://leetcode.com/problems/number-of-islands/discuss/56589/C%2B%2B-BFSDFS

https://leetcode.com/problems/number-of-islands/discuss/56359/Very-concise-Java-AC-solution

到此這篇關于C++實現(xiàn)LeetCode(200.島嶼的數(shù)量)的文章就介紹到這了,更多相關C++實現(xiàn)島嶼的數(shù)量內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C/C++實現(xiàn)捕獲所有信號的示例詳解

    C/C++實現(xiàn)捕獲所有信號的示例詳解

    Linux的信號機制大部分情況下用不到,但是由于大部分信號的默認處理是終止進程,不正確處理會惹麻煩,所以我們來看看如何使用C/C++實現(xiàn)捕獲所有信號吧
    2024-03-03
  • C語言算法練習之數(shù)組求素數(shù)

    C語言算法練習之數(shù)組求素數(shù)

    這篇文章主要為大家介紹了C語言算法練習中數(shù)組求素數(shù)的實現(xiàn)方法,文中的示例代碼講解詳細,對我們學習C語言有一定幫助,需要的可以參考一下
    2022-09-09
  • C++?數(shù)據(jù)結構超詳細講解順序表

    C++?數(shù)據(jù)結構超詳細講解順序表

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關系由它們的存儲順序自然表示
    2022-03-03
  • C++實現(xiàn)萬年歷功能

    C++實現(xiàn)萬年歷功能

    這篇文章主要為大家詳細介紹了C++實現(xiàn)萬年歷功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++11中的可變參數(shù)模板/lambda表達式

    C++11中的可變參數(shù)模板/lambda表達式

    C++11的新特性可變參數(shù)模板能夠讓我們創(chuàng)建可以接受可變參數(shù)的函數(shù)模板和類模板,相比C++98和C++03,類模板和函數(shù)模板中只能含固定數(shù)量的模板參數(shù),可變參數(shù)模板無疑是一個巨大的改進,這篇文章主要介紹了C++11中的可變參數(shù)模板/lambda表達式,需要的朋友可以參考下
    2023-03-03
  • C++實現(xiàn)哈夫曼樹的方法

    C++實現(xiàn)哈夫曼樹的方法

    這篇文章主要為大家詳細介紹了C++實現(xiàn)哈夫曼樹的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 帶你了解C++的動態(tài)內存分配

    帶你了解C++的動態(tài)內存分配

    今天小編就為大家分享一篇關于關于C++動態(tài)分配內存的介紹,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-08-08
  • C語言深入探究冒泡排序與堆排序使用案例講解

    C語言深入探究冒泡排序與堆排序使用案例講解

    算法中排序是十分重要的,而每一個學習計算機的都會在初期的時候接觸到這種排序,下面這篇文章主要給大家介紹了關于c語言冒泡排序與堆排序使用的相關資料,需要的朋友可以參考下
    2022-05-05
  • Qt圖形圖像開發(fā)之高性能曲線圖模塊QCustomplot庫詳細使用方法與實例(支持動、靜曲線圖)

    Qt圖形圖像開發(fā)之高性能曲線圖模塊QCustomplot庫詳細使用方法與實例(支持動、靜曲線圖)

    這篇文章主要介紹了Qt圖形圖像開發(fā)之高性能曲線圖模塊QCustomplot庫詳細使用方法與實例(支持動、靜曲線圖),需要的朋友可以參考下
    2020-03-03
  • C語言常見排序算法之交換排序(冒泡排序,快速排序)

    C語言常見排序算法之交換排序(冒泡排序,快速排序)

    這篇文章主要介紹了C語言常見排序算法之交換排序(冒泡排序,快速排序),冒泡排序即Bubble?Sort,類似于水中冒泡,較大的數(shù)沉下去,較小的數(shù)慢慢冒起來,假設從小到大,即為較大的數(shù)慢慢往后排,較小的數(shù)慢慢往前排
    2022-07-07

最新評論

浏阳市| 定陶县| 酒泉市| 哈巴河县| 太保市| 新乡县| 肇源县| 鄂温| 灵丘县| 肥西县| 许昌县| 宁南县| 边坝县| 灵川县| 南和县| 清涧县| 磐石市| 当阳市| 临夏市| 凉城县| 英吉沙县| 德安县| 桃江县| 都兰县| 饶河县| 交口县| 营口市| 中西区| 定结县| 汽车| 迁安市| 镇坪县| 中卫市| 偃师市| 沧源| 大港区| 卓尼县| 遵义市| 涟源市| 沂源县| 罗平县|