当前位置:   article > 正文

417. 太平洋大西洋水流问题

417. 太平洋大西洋水流问题

原题链接:417. 太平洋大西洋水流问题

 

solution:

        本题采用逆向思考,考虑太平洋和大西洋出发能抵达的点,从太平洋出发能抵达的点或1,从大西洋出发能抵达的点或2,因此两个都可以抵达的点值就为3.

dfs做法:

  1. class Solution {
  2. public:
  3. vector<vector<int>> w; //保存岛屿
  4. vector<vector<int>> sta; //保存每个点的状态
  5. vector<vector<int>> res; //定义返回值
  6. int dx[4] = {-1,0,1,0},dy[4] = {0,-1,0,1};
  7. void dfs(int x,int y,int state) {
  8. if(sta[x][y] & state) return; //sta[x][y] & sta = true表示已经遍历过了
  9. //没有遍历过则
  10. sta[x][y] |= state;
  11. for(int i = 0;i < 4;i++){
  12. int x1 = x + dx[i];
  13. int y1 = y + dy[i];
  14. if(x1 >= 0 && x1 < w.size() && y1 >= 0 && y1 < w[0].size() && w[x1][y1] >= w[x][y]){
  15. dfs(x1,y1,state);
  16. }
  17. }
  18. }
  19. vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
  20. w = heights;
  21. if(w.empty() || w[0].empty()) return res;
  22. int m = heights.size();
  23. int n = heights[0].size();
  24. sta.resize(m, vector<int> (n));
  25. for(int i = 0;i < n;i++) dfs(0,i,1);
  26. for(int i = 0;i < m;i++) dfs(i,0,1); //太平洋出发,第0为或1
  27. for(int j = 0;j < n;j++) dfs(m - 1,j,2);
  28. for(int j = 0;j < m;j++) dfs(j,n - 1,2); //大西洋出发,第1位或1
  29. for(int i = 0;i < m;i++)
  30. for(int j = 0;j < n;j++){
  31. if(sta[i][j] == 3) res.push_back({i,j});
  32. }
  33. return res;
  34. }
  35. };

bfs做法:

  1. class Solution {
  2. public:
  3. int m,n;
  4. vector<vector<int>> w; //保存岛屿
  5. vector<vector<int>> sta; //保存岛屿遍历的状态
  6. vector<vector<int>> res; //定义返回值
  7. typedef pair<int,int> PII;
  8. int dx[4] = {-1,0,1,0},dy[4] = {0,-1,0,1};
  9. queue<PII> q; //定义队列保存要遍历的点
  10. void bfs(int state) {
  11. while(!q.empty()){
  12. auto t = q.front();
  13. q.pop();
  14. int x = t.first,y = t.second;
  15. if(sta[x][y] & state) continue; //已经遍历过了
  16. sta[x][y] |= state;
  17. for(int i = 0;i < 4;i++){
  18. int x1 = x + dx[i];
  19. int y1 = y + dy[i];
  20. if(x1 >= 0 && x1 < m && y1 >= 0 && y1 < n && w[x1][y1] >= w[x][y]){
  21. q.push({x1,y1});
  22. }
  23. }
  24. }
  25. }
  26. vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
  27. w = heights;
  28. if(w.empty() || w[0].empty()) return res;
  29. m = w.size();
  30. n = w[0].size();
  31. sta.resize(m, vector<int> (n));
  32. for(int i = 0;i < m;i++) q.push({i,0});
  33. for(int j = 0;j < n;j++) q.push({0,j});
  34. bfs(1); //太平洋
  35. for(int i = 0;i < m;i++) q.push({i,n - 1});
  36. for(int j = 0;j < n;j++) q.push({m - 1,j});
  37. bfs(2); //大西洋
  38. for(int i = 0;i < m;i++)
  39. for(int j = 0;j < n;j++){
  40. if(sta[i][j] == 3) res.push_back({i,j});
  41. }
  42. return res;
  43. }
  44. };

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号