1. 程式人生 > 其它 >LeetCode 778. 水位上升的泳池中游泳

LeetCode 778. 水位上升的泳池中游泳

技術標籤:刷題

難度:困難。
跟昨天的每日一題 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; } };

在這裡插入圖片描述