class Solution { public: vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) { vector<vector<bool>> passed(heights.size(), vector<bool>(heights[0].size(), false)); vector<vector<bool>> passedR(heights.size(), vector<bool>(heights[0].size(), false)); int m = heights.size(), n = heights[0].size(); vector<vector<int>> ret; vector<vector<bool>> visited(heights.size(), vector<bool>(heights[0].size(), false)); for(int i = 0; i<m; ++i) { if(passed[i][0])continue; queue<pair<int, int>> q; passed[i][0] = true; q.push(make_pair(i, 0)); while(q.size()) { auto t = q.front(); q.pop(); int curH = heights[t.first][t.second]; visited[t.first][t.second] = true; if(t.first-1>=0 && !visited[t.first-1][t.second] && heights[t.first-1][t.second]>=curH && !passed[t.first-1][t.second]) { passed[t.first-1][t.second] = true; q.push(make_pair(t.first-1, t.second)); } if(t.second-1>=0 && !visited[t.first][t.second-1] && heights[t.first][t.second-1]>=curH && !passed[t.first][t.second-1]) { passed[t.first][t.second-1] = true; q.push(make_pair(t.first, t.second-1)); } if(t.first+1<m && !visited[t.first+1][t.second] && heights[t.first+1][t.second]>=curH && !passed[t.first+1][t.second]) { passed[t.first+1][t.second] = true; q.push(make_pair(t.first+1, t.second)); } if(t.second+1<n && !visited[t.first][t.second+1] && heights[t.first][t.second+1]>=curH && !passed[t.first][t.second+1]) { passed[t.first][t.second+1] = true; q.push(make_pair(t.first, t.second+1)); }
} }
for(auto& i : visited) { fill(i.begin(), i.end(), false); } for(int i = 0; i<n; ++i) { if(passed[0][i])continue; queue<pair<int, int>> q; passed[0][i] = true; q.push(make_pair(0, i)); while(q.size()) { auto t = q.front(); q.pop(); int curH = heights[t.first][t.second]; visited[t.first][t.second] = true; if(t.first-1>=0 && !visited[t.first-1][t.second] && heights[t.first-1][t.second]>=curH && !passed[t.first-1][t.second]) { passed[t.first-1][t.second] = true; q.push(make_pair(t.first-1, t.second)); } if(t.second-1>=0 && !visited[t.first][t.second-1] && heights[t.first][t.second-1]>=curH && !passed[t.first][t.second-1]) { passed[t.first][t.second-1] = true; q.push(make_pair(t.first, t.second-1)); } if(t.first+1<m && !visited[t.first+1][t.second] && heights[t.first+1][t.second]>=curH && !passed[t.first+1][t.second]) { passed[t.first+1][t.second] = true; q.push(make_pair(t.first+1, t.second)); } if(t.second+1<n && !visited[t.first][t.second+1] && heights[t.first][t.second+1]>=curH && !passed[t.first][t.second+1]) { passed[t.first][t.second+1] = true; q.push(make_pair(t.first, t.second+1)); }
} }
for(auto& i : visited) { fill(i.begin(), i.end(), false); } for(int i = 0; i<m; ++i) { if(passedR[i][n-1])continue; queue<pair<int, int>> q; passedR[i][n-1] = true; q.push(make_pair(i, n-1)); while(q.size()) { auto t = q.front(); q.pop(); int curH = heights[t.first][t.second]; visited[t.first][t.second] = true; if(passed[t.first][t.second])ret.push_back({t.first, t.second}); if(t.first-1>=0 && !visited[t.first-1][t.second] && heights[t.first-1][t.second]>=curH && !passedR[t.first-1][t.second]) { passedR[t.first-1][t.second] = true; q.push(make_pair(t.first-1, t.second)); } if(t.second-1>=0 && !visited[t.first][t.second-1] && heights[t.first][t.second-1]>=curH && !passedR[t.first][t.second-1]) { passedR[t.first][t.second-1] = true; q.push(make_pair(t.first, t.second-1)); } if(t.first+1<m && !visited[t.first+1][t.second] && heights[t.first+1][t.second]>=curH && !passedR[t.first+1][t.second]) { passedR[t.first+1][t.second] = true; q.push(make_pair(t.first+1, t.second)); } if(t.second+1<n && !visited[t.first][t.second+1] && heights[t.first][t.second+1]>=curH && !passedR[t.first][t.second+1]) { passedR[t.first][t.second+1] = true; q.push(make_pair(t.first, t.second+1)); }
} } for(auto& i : visited) { fill(i.begin(), i.end(), false); } for(int i = 0; i<n; ++i) { if(passedR[m-1][i])continue; queue<pair<int, int>> q; passedR[m-1][i] = true; q.push(make_pair(m-1, i)); while(q.size()) { auto t = q.front(); q.pop(); int curH = heights[t.first][t.second]; visited[t.first][t.second] = true; if(passed[t.first][t.second])ret.push_back({t.first, t.second}); if(t.first-1>=0 && !visited[t.first-1][t.second] && heights[t.first-1][t.second]>=curH && !passedR[t.first-1][t.second]) { passedR[t.first-1][t.second] = true; q.push(make_pair(t.first-1, t.second)); } if(t.second-1>=0 && !visited[t.first][t.second-1] && heights[t.first][t.second-1]>=curH && !passedR[t.first][t.second-1]) { passedR[t.first][t.second-1] = true; q.push(make_pair(t.first, t.second-1)); } if(t.first+1<m && !visited[t.first+1][t.second] && heights[t.first+1][t.second]>=curH && !passedR[t.first+1][t.second]) { passedR[t.first+1][t.second] = true; q.push(make_pair(t.first+1, t.second)); } if(t.second+1<n && !visited[t.first][t.second+1] && heights[t.first][t.second+1]>=curH && !passedR[t.first][t.second+1]) { passedR[t.first][t.second+1] = true; q.push(make_pair(t.first, t.second+1)); } } }
return ret; } };
|