Leetcode 778. 水位上升的泳池中游泳 (理解題意,並查集)

 

 

 

特別要注意數據範圍,gird數組是0到N*N-1的一個排列

思路有兩種,第一種枚舉時間(二分),從起點開始深搜或者BFS,看是否能到達右下角。

第一種的時間複雜度是

第二種思路是模擬時間,進行並查集操作,直到起點和終點連通起來。這個思路比較直接,解答選用這個思路

const int dx[] = {1,0,-1,0};
const int dy[] = {0,1,0,-1};

class Union{
private:
    int n;
    vector<int> p;

public:
    Union(int n){
        this->n = n;
        p.resize(n);
        for(int i=0;i<n;i++) p[i] = i;
    }

    int find(int x){
        if(p[x]!=x) p[x] = find(p[x]);
        return p[x];
    }

    void unite(int x, int y){
        p[find(x)] = find(y);
    }

    bool isUnite(int x, int y){
        return find(x)==find(y);
    }
};

class Solution {
public:
    int swimInWater(vector<vector<int>>& grid) {
        int n = grid.size();
        vector<int> hashmap(n*n);
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                hashmap[grid[i][j]] = i*n+j;
            }
        }
        //for(auto val:hashmap) cout<<val<<" ";
        Union un(n*n);
        for(int i=0;i<n*n;i++){
            int index = hashmap[i];
            int x = index/n, y = index%n;
            for(int j=0;j<4;j++){
                int a = x + dx[j], b = y + dy[j];
                if(a>=0&&a<n&&b>=0&&b<n&&grid[a][b]<=i){
                    un.unite(index,a*n+b);
                }
            }
            if(un.isUnite(0,n*n-1)) return i;
        }
        return n*n-1;
    }
};

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章