日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 200. 岛屿数量(图的遍历)

發布時間:2024/7/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 200. 岛屿数量(图的遍历) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目信息
    • 2. 解題
      • 2.1 DFS
      • 2.2 BFS

1. 題目信息

給定一個由 ‘1’(陸地)和 ‘0’(水)組成的的二維網格,計算島嶼的數量。一個島被水包圍,并且它是通過水平方向或垂直方向上相鄰的陸地連接而成的。你可以假設網格的四個邊均被水包圍。

示例 1:輸入: 11110 11010 11000 00000輸出: 1示例 2:輸入: 11000 11000 00100 00011輸出: 3

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/number-of-islands
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

2.1 DFS

圖的連通性問題,主程序啟動DFS,一次搜索中,遇到1的點將其置為0(只尋找1的點),后面不會再重復查找,對上下左右的點(如果存在且為1)遞歸查找。主程序中啟動DFS的次數即為答案。

class Solution { public:int numIslands(vector<vector<char>>& grid){int i, j, numofislands = 0;for(i = 0; i < grid.size(); ++i){for(j = 0; j < grid[i].size(); ++j){if(grid[i][j] == '1'){numofislands++;dfs(grid,i,j);}}}return numofislands;}void dfs(vector<vector<char>>& grid, int i, int j){grid[i][j] = '0';//標記走過了,修改了地圖(不影響解題)if(i-1 >= 0 && grid[i-1][j] == '1')dfs(grid,i-1,j);if(j-1 >= 0 && grid[i][j-1] == '1')dfs(grid,i,j-1);if(i+1 < grid.size() && grid[i+1][j] == '1')dfs(grid,i+1,j);if(j+1 < grid[i].size() && grid[i][j+1] == '1')dfs(grid,i,j+1);} };

2.2 BFS

同樣的采用BFS,對點1的四周存在且為1的點入隊,迭代查找
竟然超時了,有坑的代碼請查看我的解題評論。

找到為1的點,第一時間置0,不要等到出隊的時候再置0,會造成其他周圍的幾個點沒有及時置0,造成的重復入隊,效率降低。

class Solution//BFS { public:int numIslands(vector<vector<char>>& grid){if(grid.empty())return 0;int i, j, r, c, numofislands = 0;int x = grid.size(), y = grid[0].size();queue<pair<int,int> > q;for(i = 0; i < x; ++i){for(j = 0; j < y; ++j){if(grid[i][j] == '1'){numofislands++;q.push({i,j});while(!q.empty()){r = q.front().first;c = q.front().second;//grid[r][c] = '0';//標記走過了(不要寫在這里,否則,會重復檢查很多遍)q.pop();if(r-1 >= 0 && grid[r-1][c] == '1'){q.push({r-1,c});grid[r-1][c] = '0';//寫在這里,找到了就馬上第一時間標記}if(c-1 >= 0 && grid[r][c-1] == '1'){q.push({r,c-1});grid[r][c-1] = '0';}if(r+1 < x && grid[r+1][c] == '1'){q.push({r+1,c});grid[r+1][c] = '0';}if(c+1 < y && grid[r][c+1] == '1'){q.push({r,c+1});grid[r][c+1] = '0';}}}}}return numofislands;} }; 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的LeetCode 200. 岛屿数量(图的遍历)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。