大部分都是模板题,以训练理解原理为主。

网格类 130. 被围绕的区域
200. 岛屿数量
695. 岛屿的最大面积
面试题 16.19. 水域大小

一、网格类

130. 被围绕的区域

题解

  1. class Solution {
  2. public:
  3. int M, N;
  4. void solve(vector<vector<char>> &board) {
  5. if (board.size() == 0)return;
  6. M = board.size();
  7. N = board[0].size();
  8. for (int i = 0; i < M; i++) {
  9. for (int j = 0; j < N; j++) {
  10. bool isEdge = (i == 0 || j == 0 || i == M - 1 || j == N - 1);
  11. if (isEdge && board[i][j] == 'O') {
  12. dfs(board, i, j);
  13. }
  14. }
  15. }
  16. for (int i = 0; i < M; i++) {
  17. for (int j = 0; j < N; j++) {
  18. if (board[i][j] == 'O') {
  19. board[i][j] = 'X';
  20. }
  21. if (board[i][j] == '#') {
  22. board[i][j] = 'O';
  23. }
  24. }
  25. }
  26. }
  27. void dfs(vector<vector<char>> &board, int i, int j) {
  28. if (i < 0 || j < 0 || i >= M || j >= N || board[i][j] == 'X' || board[i][j] == '#') { return; }
  29. board[i][j] = '#';
  30. dfs(board, i - 1, j);
  31. dfs(board, i + 1, j);
  32. dfs(board, i, j + 1);
  33. dfs(board, i, j - 1);
  34. }
  35. };

200. 岛屿数量

  1. class Solution {
  2. public:
  3. vector<vector<int>> dirs = {
  4. {0, 1},
  5. {1, 0},
  6. {0, -1},
  7. {-1, 0}
  8. };
  9. vector<vector<bool>> visited;
  10. int M, N;
  11. int numIslands(vector<vector<char>> &grid) {
  12. M = grid.size();
  13. N = grid[0].size();
  14. visited = vector<vector<bool>>(M, vector<bool>(N, 0));
  15. int ans = 0;
  16. for (int i = 0; i < M; i++) {
  17. for (int j = 0; j < N; j++) {
  18. if (!visited[i][j] && grid[i][j] == '1') {
  19. dfs(grid, i, j);
  20. ans += 1;
  21. }
  22. }
  23. }
  24. return ans;
  25. }
  26. void dfs(vector<vector<char>> &grid, int i, int j) {
  27. //染色
  28. visited[i][j] = 1;
  29. for (auto dir:dirs) {
  30. int x = i + dir[0];
  31. int y = j + dir[1];
  32. if (isValid(x, y) && !visited[x][y] && grid[x][y] == '1') {
  33. dfs(grid, x, y);
  34. }
  35. }
  36. }
  37. bool isValid(int i, int j) {
  38. if (i < 0 || i >= M || j < 0 || j >= N) {
  39. return false;
  40. }
  41. return true;
  42. }
  43. };

695. 岛屿的最大面积

  1. class Solution {
  2. public:
  3. vector<vector<int>> dirs = {
  4. {0, 1},
  5. {1, 0},
  6. {0, -1},
  7. {-1, 0}
  8. };
  9. vector<vector<bool>> visited;
  10. int M, N;
  11. int maxAreaOfIsland(vector<vector<int>> &grid) {
  12. M = grid.size();
  13. N = grid[0].size();
  14. int ans = 0;
  15. visited = vector<vector<bool>>(M, vector<bool>(N, 0));
  16. for (int i = 0; i < M; i++) {
  17. for (int j = 0; j < N; j++) {
  18. if (!visited[i][j] && grid[i][j]) {
  19. ans = max(ans, dfs(grid, i, j));
  20. }
  21. }
  22. }
  23. return ans;
  24. }
  25. int dfs(vector<vector<int>> &grid, int i, int j) {
  26. visited[i][j] = 1;
  27. int ans = 1;
  28. for (auto dir:dirs) {
  29. int x = i + dir[0];
  30. int y = j + dir[1];
  31. if (isValid(x, y) && !visited[x][y] && grid[x][y]) {
  32. ans += dfs(grid, x, y);
  33. }
  34. }
  35. return ans;
  36. }
  37. bool isValid(int i, int j) {
  38. return i >= 0 && i < M && j >= 0 && j < N;
  39. }
  40. };

面试题 16.19. 水域大小

DFS解法:

  1. class Solution {
  2. public:
  3. int M, N;
  4. vector<vector<bool>> visited;
  5. vector<vector<int>> dirs = {{0, 1},
  6. {1, 1},
  7. {1, 0},
  8. {1, -1},
  9. {0, -1},
  10. {-1, -1},
  11. {-1, 0},
  12. {-1, 1}};
  13. vector<int> ans;
  14. vector<int> pondSizes(vector<vector<int>> &land) {
  15. M = land.size();
  16. N = land[0].size();
  17. visited = vector<vector<bool>>(M, vector<bool>(N, false));
  18. for (int i = 0; i < M; ++i) {
  19. for (int j = 0; j < N; ++j) {
  20. if (!visited[i][j] && land[i][j] == 0) {
  21. ans.push_back(dfs(land, i, j));
  22. }
  23. }
  24. }
  25. sort(ans.begin(), ans.end());
  26. return ans;
  27. }
  28. int dfs(vector<vector<int>> &land, int i, int j) {
  29. if (i < 0 || i >= M || j < 0 || j >= N || land[i][j] || visited[i][j]) {
  30. return 0;
  31. }
  32. visited[i][j] = 1;
  33. int res = 1;
  34. for (int k = 0; k < dirs.size(); k++) {
  35. int x = i + dirs[k][0];
  36. int y = j + dirs[k][1];
  37. res += dfs(land, x, y);
  38. }
  39. return res;
  40. }
  41. };

BFS解法:

  1. class Solution {
  2. public:
  3. vector<vector<bool>> visited;
  4. vector<int> ans;
  5. vector<vector<int>> dirs = {
  6. {1, 0},
  7. {1, -1},
  8. {0, -1},
  9. {-1, -1},
  10. {-1, 0},
  11. {-1, 1},
  12. {0, 1},
  13. {1, 1}
  14. };
  15. int M, N;
  16. vector<int> pondSizes(vector<vector<int>> &land) {
  17. M = land.size();
  18. N = land[0].size();
  19. queue<pair<int, int>> q;
  20. int count = 0;
  21. visited = vector<vector<bool>>(M, vector<bool>(N, 0));
  22. for (int i = 0; i < M; i++) {
  23. for (int j = 0; j < N; ++j) {
  24. if (visited[i][j] || land[i][j] > 0) {
  25. continue;
  26. }
  27. q.push({i, j});
  28. visited[i][j] = 1;
  29. count = 0;
  30. while (!q.empty()) {
  31. pair<int, int> p = q.front();
  32. count += 1;
  33. q.pop();
  34. for (int k = 0; k < dirs.size(); k++) {
  35. int x = p.first + dirs[k][0];
  36. int y = p.second + dirs[k][1];
  37. if (x < 0 || x >= M || y < 0 || y >= N || visited[x][y] || land[x][y] > 0) {
  38. continue;
  39. }
  40. visited[x][y] = 1;
  41. q.push({x, y});
  42. }
  43. }
  44. ans.push_back(count);
  45. }
  46. }
  47. sort(ans.begin(),ans.end());
  48. return ans;
  49. }
  50. };