image.png

思路1:BFS

  • 此题为经典DFS、经典BFS问题
  • 从低往高,从边缘往中间进行搜索LC417. 太平洋大西洋水流问题
  • 这个解法是参考了大佬的,亮点主要包括以下几点:
    • 利用|= 1; |= 2这样的手段去记录状态矩阵,非常简洁
    • BFS的起始点设置了很多个,这样可以加快遍历速度
    • 利用状态矩阵前后数值是否一致,去判断是否需要加入队列(在加入队列的时候设置去重的检验)
    • valid(x, y)函数独立到外部,写法简洁易懂。

      代码1:BFS

  1. class Solution {
  2. public:
  3. int dx[4] = {0, 1, -1, 0};
  4. int dy[4] = {1, 0, 0, -1};
  5. bool valid(int x, int y, int row, int col) {
  6. if (x < 0 || x >= row) {
  7. return false;
  8. }
  9. if (y < 0 || y >= col) {
  10. return false;
  11. }
  12. return true;
  13. }
  14. vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
  15. int row = heights.size(), col = heights[0].size();
  16. vector<vector<int>> rec(row, vector<int>(col, 0));
  17. queue<pair<int, int>> q;
  18. // 初始队列需要放进去很多东西,同时,需要在入队时设置矩阵状态,避免重复遍历
  19. for (int i = 0; i < row; ++i) {
  20. q.push(make_pair(i, 0));
  21. rec[i][0] |= 1;
  22. q.push(make_pair(i, col - 1));
  23. rec[i][col - 1] |= 2;
  24. }
  25. // p:01 A:10
  26. // 重复放也不要怕,进入队列的时候有去重的检验手段了
  27. for (int i = 0; i < col; ++i) {
  28. q.push(make_pair(0, i));
  29. rec[0][i] |= 1;
  30. q.push(make_pair(row - 1, i));
  31. rec[row - 1][i] |= 2;
  32. }
  33. while (!q.empty()) {
  34. pair<int, int> cur_node = q.front();
  35. q.pop();
  36. int cur_x = cur_node.first, cur_y = cur_node.second;
  37. for (int i = 0; i < 4; ++i) {
  38. int nxt_x = cur_x + dx[i], nxt_y = cur_y + dy[i];
  39. if (!valid(nxt_x, nxt_y, row, col)) {
  40. continue;
  41. }
  42. if (heights[nxt_x][nxt_y] < heights[cur_x][cur_y]) {
  43. continue;
  44. }
  45. // 说明已经访问过了
  46. if (rec[nxt_x][nxt_y] == rec[cur_x][cur_y]) {
  47. continue;
  48. }
  49. q.push(make_pair(nxt_x, nxt_y));
  50. rec[nxt_x][nxt_y] |= rec[cur_x][cur_y];
  51. }
  52. }
  53. vector<vector<int>> ans;
  54. for (int i = 0; i < row; ++i) {
  55. for (int j = 0; j < col; ++j) {
  56. // P:01 A:10 both:11
  57. if (rec[i][j] == 3) {
  58. ans.push_back({i, j});
  59. }
  60. }
  61. }
  62. return ans;
  63. }
  64. };

思路2:DFS todo