特別要注意數據範圍,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;
}
};