LeetCode 778. 水位上升的泳池中游泳
阿新 • • 發佈:2021-01-31
技術標籤:刷題
難度:困難。
跟昨天的每日一題 1631. 最小體力消耗路徑 一樣的。
並查集 正確解法:
class UnionfindSet{
public:
vector<int> parents;
UnionfindSet(int n):parents(vector<int> (n)){
for(int i = 0; i < n; i++){
parents[i] = i;
}
}
int find_root(int x){
return parents[ x] == x?parents[x]:parents[x] = find_root(parents[x]);
}
void merge(int x, int y){
int rootx = find_root(x);
int rooty = find_root(y);
if(rootx != rooty){
parents[rooty] = rootx;
}
}
bool connect(int x, int y){
int rootx = find_root (x);
int rooty = find_root(y);
return rootx == rooty;
}
};
class Solution {
public:
int swimInWater(vector<vector<int>>& grid) {
int n = grid.size();
vector<tuple<int, int, int>> points;
for(int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
int start = i * n + j;
if(i < n - 1){
int weight = grid[i][j] > grid[i + 1][j]?grid[i][j]:grid[i + 1][j];
points.emplace_back(start, start + n, weight);
}
if(j < n - 1){
int weight = grid[i][j] > grid[i][j + 1]?grid[i][j]:grid[i][j + 1];
points.emplace_back(start, start + 1, weight);
}
}
}
sort(points.begin(), points.end(),[](const auto& p1, const auto& p2){
auto&& [x1, y1, v1] = p1;
auto&& [x2, y2, v2] = p2;
return v1 < v2;
});
UnionfindSet uf(n * n);
for(const auto [x, y, v] : points){
uf.merge(x, y);
if(uf.connect(0, n * n - 1)){
return v;
}
}
return 0;
}
};