最近加班時間又多了,隨緣吧,干不動就辭唄。真是想歇幾天了,題不能停!!今天目前只做了一道題,先用兩種方式把他搞出來。
695. 島嶼的最大面積
class Solution {
public:int neighbor[4][2] = {1,0,0,-1,-1,0,0,1};int count = 0;int maxAreaOfIsland(vector<vector<int>>& grid) {int n = grid.size();int m = grid[0].size();int result = 0;vector<vector<bool>>visited(n,vector<bool>(m,false));for(int i = 0;i < n;i++){for(int j = 0;j < m;j++){if(visited[i][j] == 0 && grid[i][j] == 1){count = 1;visited[i][j] = 1;dfs(grid,visited,i,j);result = max(result,count);} }}return result;}void dfs(vector<vector<int>>& grid,vector<vector<bool>>&visited,int x,int y){for(int i = 0;i < 4;i++){int nextx = x + neighbor[i][0];int nexty = y + neighbor[i][1];if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size())continue;if(visited[nextx][nexty] == 0 && grid[nextx][nexty] == 1){count++;visited[nextx][nexty] = 1;dfs(grid,visited,nextx,nexty);}}}
};
BFS方法默寫如下
class Solution {
public:int result = 0;int neighbor[4][2] = {1,0,0,-1,-1,0,0,1};queue<pair<int,int>>que;int maxAreaOfIsland(vector<vector<int>>& grid) {int count = 0;int n = grid.size(),m = grid[0].size();vector<vector<bool>>visited(n,vector<bool>(m,false));for(int i = 0;i < n;i++){for(int j = 0;j<m;j++){if(visited[i][j] == false && grid[i][j] == 1){count = 1;visited[i][j] = true;bfs(grid,visited,i,j,count);result = max(count,result);}}}return result; }void bfs(vector<vector<int>>& grid,vector<vector<bool>>&visited,int x,int y,int &count){que.push({x,y});while(!que.empty()){pair<int,int>cur = que.front();que.pop();for(int i = 0;i < 4;i++){int nextx = cur.first + neighbor[i][0];int nexty = cur.second + neighbor[i][1];if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size())continue;if(visited[nextx][nexty] == false && grid[nextx][nexty] == 1){visited[nextx][nexty] = true;count++;que.push({nextx,nexty});}}}}
};
所以那個count可以這么用,&改的話,還是改了那個地址的值的,如果沒有&的話,那他在函數里就不變啦。
1020. 飛地的數量
目前感覺dfs和bfs的用法有一個認識了,dfs由于需要做回溯,感覺更難一點,后面優先練dfs。這題的dfs有點難度。。。
思路很牛逼,需要先將周邊(四周)是陸地的變成海洋,再重新算一下陸地的數量即可。
class Solution {
public:int count = 0;int neighbor[4][2] = {1,0,0,-1,-1,0,0,1};int numEnclaves(vector<vector<int>>& grid) {int n = grid.size();int m = grid[0].size();for(int i = 0;i < n;i++){if(grid[i][0] == 1 )dfs(grid,i,0);if(grid[i][m-1] == 1)dfs(grid,i,m-1);}for(int j = 1;j<m-1;j++){if(grid[0][j] == 1 )dfs(grid,0,j);if(grid[n-1][j] == 1)dfs(grid,n-1,j);}count = 0;for(int i = 0;i < n;i++){for(int j = 0;j < m;j++){if(grid[i][j] == 1)dfs(grid,i,j);}}return count;}void dfs(vector<vector<int>>& grid,int x,int y){grid[x][y] = 0;count++;for(int i = 0;i < 4;i++){int nextx = x + neighbor[i][0];int nexty = y + neighbor[i][1];if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size())continue;if( grid[nextx][nexty] == 1){dfs(grid,nextx,nexty);}}}
};
力扣炸了???絕,提測交給明天。。。然后再改改看
BFS看起來是一樣的思路,我就不做第二遍啦(count++似乎容易漏while里外都要有count++,估計提交就能了解這個錯誤。不多逼逼)
好累啊今天,打把爐石睡覺!