797m. 所有可能的路徑
題目鏈接
代碼隨想錄文章講解鏈接
方法一:DFS
用時:11m43s
思路
- 時間復(fù)雜度: O ( n ? 2 n ) O(n \cdot 2^n) O(n?2n),n是節(jié)點個數(shù),最壞情況每個節(jié)點都可以去往任意一個在它后面的節(jié)點,那么第i個節(jié)點去到最后一個節(jié)點的路徑數(shù)就有 2 n ? i ? 2 2^{n-i-2} 2n?i?2,就是當前節(jié)點和最后一個節(jié)點必走,其他的節(jié)點有兩種選擇——走或不走。
- 空間復(fù)雜度: O ( n ) O(n) O(n)。
C++代碼
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void backTracking(vector<vector<int>>& graph, int i) {
if (i == graph.size() - 1) {
res.push_back(path);
return;
}
for (int j = 0; j < graph[i].size(); ++j) {
path.push_back(graph[i][j]);
backTracking(graph, graph[i][j]);
path.pop_back(); // 回溯
}
}
public:
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
path.push_back(0);
backTracking(graph, 0);
return res;
}
};
方法二:BFS
用時:16m18s
思路
隊列中記錄的元素是路徑。
- 時間復(fù)雜度: O ( ) O() O()
- 空間復(fù)雜度: O ( ) O() O()
C++代碼
class Solution {
public:
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
queue<vector<int>> que;
vector<vector<int>> res;
que.push({0});
while (!que.empty()) {
vector<int> path = que.front();
que.pop();
for (int i = 0; i < graph[path.back()].size(); ++i) {
vector<int> tmp = path;
tmp.push_back(graph[path.back()][i]);
if (tmp.back() == graph.size() - 1) res.push_back(tmp);
else que.push(tmp);
}
}
return res;
}
};
看完講解的思考
無。文章來源:http://www.zghlxwxcb.cn/news/detail-738936.html
代碼實現(xiàn)遇到的問題
無。
200m. 島嶼數(shù)量
題目鏈接
代碼隨想錄文章講解鏈接
方法一:DFS
用時:17m48s
思路
遍歷每個元素,若是陸地則使用DFS搜索與之相鄰的所有陸地,并使用一個二維數(shù)組記錄哪些陸地已經(jīng)遍歷過。
當遍歷到新的島嶼時,島嶼數(shù)加1。
- 時間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)
- 空間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)
C++代碼
class Solution {
private:
int m;
int n;
int dir[4][2] = {0, -1, 1, 0, 0, 1, -1, 0};
void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {
visited[x][y] = true;
for (int i = 0; i < 4; ++i) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (!(nextx < 0 || nextx >= m || nexty < 0 || nexty >= n) && !visited[nextx][nexty] && grid[nextx][nexty] == '1') dfs(grid, visited, nextx, nexty);
}
}
public:
int numIslands(vector<vector<char>>& grid) {
m = grid.size();
n = grid[0].size();
vector<vector<bool>> visited(m, vector<bool>(n, false));
int res = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (!visited[i][j] && grid[i][j] == '1') {
++res;
dfs(grid, visited, i, j);
}
}
}
return res;
}
};
方法二:方法一優(yōu)化
思路
可以不用數(shù)組記錄哪些陸地訪問過,只用把訪問過的陸地置0即可。
- 時間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)
- 空間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)
C++代碼
class Solution {
private:
int m;
int n;
int dir[4][2] = {0, -1, 1, 0, 0, 1, -1, 0};
void dfs(vector<vector<char>>& grid, int x, int y) {
grid[x][y] = '0';
for (int i = 0; i < 4; ++i) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (!(nextx < 0 || nextx >= m || nexty < 0 || nexty >= n) && grid[nextx][nexty] == '1') dfs(grid, nextx, nexty);
}
}
public:
int numIslands(vector<vector<char>>& grid) {
m = grid.size();
n = grid[0].size();
int res = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] == '1') {
++res;
dfs(grid, i, j);
}
}
}
return res;
}
};
看完講解的思考
代碼實現(xiàn)遇到的問題
方法三:BFS
思路
- 時間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)
- 空間復(fù)雜度: O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))
C++代碼
class Solution {
private:
int m;
int n;
int dir[4][2] = {0, -1, 1, 0, 0, 1, -1, 0};
void bfs(vector<vector<char>>& grid, int x, int y) {
queue<pair<int, int>> que;
grid[x][y] = '0';
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] == '1') {
grid[nextx][nexty] = '0';
que.push(pair<int, int>(nextx, nexty));
}
}
}
}
public:
int numIslands(vector<vector<char>>& grid) {
m = grid.size();
n = grid[0].size();
int res = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] == '1') {
++res;
bfs(grid, i, j);
}
}
}
return res;
}
};
看完講解的思考
無。
代碼實現(xiàn)遇到的問題
無。
695m. 島嶼的最大面積
題目鏈接
代碼隨想錄文章講解鏈接
方法一:DFS
用時:16m39s
思路
當遇到陸地時,DFS該島嶼,記錄該島嶼的面積,并將遍歷過的陸地置零,最后返回最大的島嶼的面積。
- 時間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)。
- 空間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)。
C++代碼
class Solution {
private:
int m;
int n;
int area;
void dfs(vector<vector<int>>& grid, int x, int y) {
grid[x][y] = 0;
area += 1;
if (x - 1 >= 0 && grid[x - 1][y] == 1) dfs(grid, x - 1, y);
if (x + 1 < m && grid[x + 1][y] == 1) dfs(grid, x + 1, y);
if (y - 1 >= 0 && grid[x][y - 1] == 1) dfs(grid, x, y - 1);
if (y + 1 < n && grid[x][y + 1] == 1) dfs(grid, x, y + 1);
}
public:
int maxAreaOfIsland(vector<vector<int>>& grid) {
int res = 0;
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) {
area = 0;
dfs(grid, i, j);
res = max(res, area);
}
}
}
return res;
}
};
方法二:BFS
思路
- 時間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)
- 空間復(fù)雜度: O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))
C++代碼
class Solution {
private:
int m;
int n;
int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
int bfs(vector<vector<int>>& grid, int x, int y) {
int area = 1;
queue<pair<int, int>> que;
que.push(pair<int, int>(x, y));
grid[x][y] = 0;
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] == 1) {
grid[nextx][nexty] = 0;
area += 1;
que.push(pair<int, int>(nextx, nexty));
}
}
}
return area;
}
public:
int maxAreaOfIsland(vector<vector<int>>& grid) {
int res = 0;
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) res = max(res, bfs(grid, i, j));
}
}
return res;
}
};
看完講解的思考
無。
代碼實現(xiàn)遇到的問題
BFS時,元素入列的時候就要做標記,不能在元素出列的時候才做標記,不然會重復(fù)遍歷。
1020m. 飛地的數(shù)量
題目鏈接
代碼隨想錄文章講解鏈接
方法一:DFS
用時:20m42s
思路
在上一題695m的基礎(chǔ)上,加多一個變量用于記錄當前島嶼是否臨界,如果不是的話將島嶼的陸地數(shù)量記錄。
- 時間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)。
- 空間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)。
C++代碼
class Solution {
private:
int m;
int n;
int num;
bool flag;
void dfs(vector<vector<int>>& grid, int x, int y) {
grid[x][y] = 0;
num += 1;
if (x - 1 < 0) flag = true;
else if (grid[x - 1][y] == 1) dfs(grid, x - 1, y);
if (x + 1 >= m) flag = true;
else if (grid[x + 1][y] == 1) dfs(grid, x + 1, y);
if (y - 1 < 0) flag = true;
else if (grid[x][y - 1] == 1) dfs(grid, x, y - 1);
if (y + 1 >= n) flag = true;
else if (grid[x][y + 1] == 1) dfs(grid, x, y + 1);
}
public:
int numEnclaves(vector<vector<int>>& grid) {
int res = 0;
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) {
num = 0;
flag = false;
dfs(grid, i, j);
if (!flag) res += num;
}
}
}
return res;
}
};
方法二:BFS
思路
- 時間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)。
- 空間復(fù)雜度: O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))。
C++代碼
class Solution {
private:
int m;
int n;
int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
int bfs(vector<vector<int>>& grid, int x, int y) {
int num = 1;
queue<pair<int, int>> que;
que.push(pair<int, int>(x, y));
grid[x][y] = 0;
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) num = INT_MIN;
else if (grid[nextx][nexty] == 1) {
grid[nextx][nexty] = 0;
++num;
que.push(pair<int, int>(nextx, nexty));
}
}
}
return num;
}
public:
int numEnclaves(vector<vector<int>>& grid) {
int res = 0;
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) res += max(0, bfs(grid, i, j));
}
}
return res;
}
};
看完講解的思考
無。
代碼實現(xiàn)遇到的問題
無。
130m. 被圍繞的區(qū)域
題目鏈接
代碼隨想錄文章講解鏈接
方法一:DFS
用時:17m13s
思路
遍歷位于臨界的元素,若是’O’則將連通的’O’變成’H’,最后再將board中的所有’O’替換成’X’,‘H’替換成’O’,因為此時剩下的’O’是位于board內(nèi)部的無法連接到外部的元素,直接將其變成’X’,而’H’是可以連通到外部的’O’,將其變回’O’。
- 時間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)。
- 空間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)。
C++代碼
class Solution {
private:
int m;
int n;
void dfs(vector<vector<char>>& board, int x, int y) {
board[x][y] = 'H';
if (x - 1 >= 0 && board[x - 1][y] == 'O') dfs(board, x - 1, y);
if (x + 1 < m && board[x + 1][y] == 'O') dfs(board, x + 1, y);
if (y - 1 >= 0 && board[x][y - 1] == 'O') dfs(board, x, y - 1);
if (y + 1 < n && board[x][y + 1] == 'O') dfs(board, x, y + 1);
}
public:
void solve(vector<vector<char>>& board) {
m = board.size();
n = board[0].size();
for (int i = 0; i < m; ++i) {
if (board[i][0] == 'O') dfs(board, i, 0);
if (board[i][n - 1] == 'O') dfs(board, i, n - 1);
}
for (int i = 0; i < n; ++i) {
if (board[0][i] == 'O') dfs(board, 0, i);
if (board[m - 1][i] == 'O') dfs(board, m - 1, i);
}
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (board[i][j] == 'H') board[i][j] = 'O';
else if (board[i][j] == 'O') board[i][j] = 'X';
}
}
}
};
方法二:BFS
思路
就是遍歷的方法從DFS換成BFS,懶得寫了。
- 時間復(fù)雜度: O ( m ? n ) O(m \cdot n) O(m?n)。
- 空間復(fù)雜度: O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))。
看完講解的思考
無。
代碼實現(xiàn)遇到的問題
無。
最后的碎碎念
就快要一刷完代碼隨想錄,沖!文章來源地址http://www.zghlxwxcb.cn/news/detail-738936.html
到了這里,關(guān)于代碼隨想錄Day41-圖論:力扣第797m、200m、695m、1020m、130m題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!