Cover image for 面试经典150题 P200 岛屿数量

面试经典150题 P200 岛屿数量


时间轴

时间轴

2025-11-03

init

DFS

题目:

DFS 判断岛屿数量,本质上是用 DFS 看连通图的个数

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
#include <vector>#include <utility>#include <stack>using std::vector;using std::pair;using std::stack;class Solution {    public:	int numIslands(vector<vector<char> > &grid)	{		int m = grid.size(), n = grid[0].size();		vector<vector<bool> > visited =			vector<vector<bool> >(m, vector<bool>(n, false));		int island_num = 0;		int i, j;		stack<pair<int, int> > st;		for (i = 0; i < m; i++) {			for (j = 0; j < n; j++) {				if (visited[i][j] || grid[i][j] =='0')					continue;				st.push({ i, j });				while (!st.empty()) {					auto [curr_i, curr_j] = st.top();					visited[curr_i][curr_j] = true;					st.pop();					// 上					if (curr_i - 1 >= 0 &&					    !visited[curr_i - 1][curr_j] &&					    grid[curr_i - 1][curr_j] == '1') {						st.push({ curr_i - 1, curr_j });					}					// 下					if (curr_i + 1 < m &&					    !visited[curr_i + 1][curr_j] &&					    grid[curr_i + 1][curr_j] == '1') {						st.push({ curr_i + 1, curr_j });					}					// 左					if (curr_j - 1 >= 0 &&					    !visited[curr_i][curr_j - 1] &&					    grid[curr_i][curr_j - 1] == '1') {						st.push({ curr_i, curr_j - 1 });					}					// 右					if (curr_j + 1 < n &&					    !visited[curr_i][curr_j + 1] &&					    grid[curr_i][curr_j + 1] == '1') {						st.push({ curr_i, curr_j + 1 });					}				}				island_num ++;			}		}		return island_num;	}};

leetcoe hot 100 rewrite, 发现之前的写法会导致 同一个节点可能被多次入栈 , 因此 visited 标记表示为已经入栈过更好。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
#include <vector>#include <stack>#include <utility>using std::vector;using std::pair;using std::stack;class Solution {    public:        int numIslands(vector<vector<char> > &grid)        {                // 1 <= m, n <= 300                int i, j, m = grid.size(), n = grid[0].size();                vector<vector<bool> > visited(m, vector<bool>(n, false));                stack<pair<int, int> > stk;                int nr_island = 0;                for (i = 0; i < m; i++) {                        for (j = 0; j < n; j++) {                                if (visited[i][j] || grid[i][j] == '0')                                        continue;                                // DFS                                stk.push({ i, j });                                visited[i][j] = true; // 表示已经入栈                                while (!stk.empty()) {                                        auto [ipos, jpos] = stk.top();                                        stk.pop();                                        // 上                                        if (ipos - 1 >= 0 && !visited[ipos - 1][jpos] &&                                            grid[ipos - 1][jpos] == '1') {                                                stk.push({ ipos - 1, jpos });                                                visited[ipos - 1][jpos] = true;                                        }                                        // 下                                        if (ipos + 1 < m && !visited[ipos + 1][jpos] &&                                            grid[ipos + 1][jpos] == '1') {                                                stk.push({ ipos + 1, jpos });                                                visited[ipos + 1][jpos] = true;                                        }                                        // 左                                        if (jpos - 1 >= 0 && !visited[ipos][jpos - 1] &&                                            grid[ipos][jpos - 1] == '1') {                                                stk.push({ ipos, jpos - 1 });                                                visited[ipos][jpos - 1] = true;                                        }                                        // 右                                        if (jpos + 1 < n && !visited[ipos][jpos + 1] &&                                            grid[ipos][jpos + 1] == '1') {                                                stk.push({ ipos, jpos + 1 });                                                visited[ipos][jpos + 1] = true;                                        }                                }                                nr_island++;                        }                }                return nr_island;        }};
评论加载中…