• 图论第4天


    周末还是懈怠啊,不如有个随想录催促我,今天没咋干活,先把昨天的内容补上,

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

    溯流而上是需要考虑的内容,其次就是只要他可以,就给他true,我要我四周,都比我高的继续找。比我高他就是true。

    1. class Solution {
    2. public:
    3. int neighbor[4][2] = {1,0,0,-1,-1,0,0,1};
    4. vectorint>> pacificAtlantic(vectorint>>& heights) {
    5. int n = heights.size();
    6. int m = heights[0].size();
    7. vectorint>>result;
    8. vectorbool>>Pacific_visited(n,vector<bool>(m,false));
    9. vectorbool>>Atlantic_visited(n,vector<bool>(m,false));
    10. //横向
    11. for(int i = 0;i < n;i++){
    12. dfs(heights,Pacific_visited,i,0);
    13. dfs(heights,Atlantic_visited,i,m-1);
    14. }
    15. //纵向
    16. for(int j = 0;j < m;j++){
    17. dfs(heights,Pacific_visited,0,j);
    18. dfs(heights,Atlantic_visited,n-1,j);
    19. }
    20. for(int i = 0;i < n;i++){
    21. for(int j = 0;j < m;j++){
    22. if(Pacific_visited[i][j] == true && Atlantic_visited[i][j] == true){
    23. result.push_back({i,j});
    24. }
    25. }
    26. }
    27. return result;
    28. }
    29. void dfs(vectorint>> &heights,vectorbool>> &visited,int x,int y){
    30. if(visited[x][y] == true)return;
    31. visited[x][y] = true;
    32. for(int i = 0;i < 4;i++){
    33. int nextx = x + neighbor[i][0];
    34. int nexty = y + neighbor[i][1];
    35. if(nextx < 0 || nexty < 0 || nextx >= heights.size() || nexty >= heights[0].size())continue;
    36. if(heights[x][y] > heights[nextx][nexty])continue;
    37. dfs(heights,visited,nextx,nexty);
    38. }
    39. return;
    40. }
    41. };

    827.最大人工岛

    卧槽卧槽,这题真有成就感啊,好难啊。

    随想录帮忙解决了两件事:

    1、isAllGrid的用法

    2、这个岛屿是否标记过,visitedGrid

    1. class Solution
    2. {
    3. public:
    4. int neighbor[4][2] = {1, 0, 0, -1, -1, 0, 0, 1};
    5. int count = 0;
    6. int index = 2;
    7. unordered_map<int, int> map;
    8. int largestIsland(vectorint>> &grid)
    9. {
    10. int result = 0;
    11. int n = grid.size();
    12. int m = grid[0].size();
    13. vectorint>> visited(n, vector<int>(m, 0));
    14. bool isAllGrid = true;
    15. for (int i = 0; i < n; i++)
    16. {
    17. for (int j = 0; j < m; j++)
    18. {
    19. if (grid[i][j] == 0)
    20. isAllGrid = false;
    21. if (grid[i][j] == 1 && visited[i][j] == 0)
    22. {
    23. count = 1;
    24. visited[i][j] = index;
    25. bfs(grid, visited, i, j);
    26. map[index] = count;
    27. // cout << index << "是" << map[index] << endl;
    28. index++;
    29. }
    30. }
    31. }
    32. if (isAllGrid)
    33. return n * m;
    34. for (int i = 0; i < n; i++)
    35. {
    36. for (int j = 0; j < m; j++)
    37. {
    38. if (grid[i][j] == 0)
    39. {
    40. result = max(result, findMax(grid, visited, i, j));
    41. // cout << "grid[" << i << "][" << j << "] 结果是 " << result << endl;
    42. }
    43. }
    44. }
    45. // for (int i = 0; i < n; i++)
    46. // {
    47. // for (int j = 0; j < m; j++)
    48. // {
    49. // cout << "visited[" << i << "][" << j << "]是" << visited[i][j] << endl;
    50. // }
    51. // }
    52. // for (int i = 2; i <= index; i++)
    53. // {
    54. // cout << "map[" << i << "]是" << map[i] << endl;
    55. // }
    56. return result;
    57. }
    58. void bfs(vectorint>> &grid, vectorint>> &visited, int x, int y)
    59. {
    60. visited[x][y] = index;
    61. for (int i = 0; i < 4; i++)
    62. {
    63. int nextx = x + neighbor[i][0];
    64. int nexty = y + neighbor[i][1];
    65. if (nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size())
    66. continue;
    67. if (grid[nextx][nexty] == 1 && visited[nextx][nexty] == 0)
    68. {
    69. count++;
    70. bfs(grid, visited, nextx, nexty);
    71. }
    72. }
    73. }
    74. int findMax(vectorint>> &grid, vectorint>> &visited, int x, int y)
    75. {
    76. int sumMax = 1;
    77. unordered_set<int> visitedGrid;
    78. for (int i = 0; i < 4; i++)
    79. {
    80. int nextx = x + neighbor[i][0];
    81. int nexty = y + neighbor[i][1];
    82. if (nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size())
    83. continue;
    84. if (visitedGrid.count(visited[nextx][nexty]))
    85. continue;
    86. if (grid[nextx][nexty] == 1)
    87. {
    88. sumMax += map[visited[nextx][nexty]];
    89. visitedGrid.insert(visited[nextx][nexty]);
    90. }
    91. }
    92. return sumMax;
    93. }
    94. };

    我的写法应该是有一些冗余,不过基本上可以覆盖思路。

    1.首先先做遍历岛屿,标记所有岛屿的大小。

    2.然后再遍历海洋,看哪块海洋连接在一起会让岛屿最大。

    3.考虑加岛屿的时候要确认别重复加了。

    4.考虑全岛屿情况。

    5.在搞函数的时候,发生了for循环走不出来,visit没标记已经查过的岛屿的问题(这个查了一段时间才搞出来)

    牛逼!睡觉!

  • 相关阅读:
    Groovy的规则脚本引擎实战
    docker容器使用GPU方法
    广州华锐互动:VR动物解剖实验室带来哪些便利?
    【开源】JAVA+Vue.js实现个人健康管理系统
    英语写作中“省略”、“忽略”、“忽视”omit、ignore、neglect 的用法
    Layui快速入门之第八节 表格渲染与属性的使用
    Ceph入门到精通-netstat -s|grep “dropped“
    简单好用的苹果手机软件数据备份软件
    基于nodejs+vue市民健身中心网上平台mysql
    VS2019 编译Postgrsql 的windows平台代码和调试
  • 原文地址:https://blog.csdn.net/weixin_41902984/article/details/139380831