时间轴
时间轴
2025-11-03
init
DFS
题目:
DFS 判断岛屿数量,本质上是用 DFS 看连通图的个数
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | 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 | 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; }}; |
