在一個 N x N 的坐標方格 grid 中,每一個方格的值 grid[i][j] 表示在位置 (i,j) 的平臺高度。
現在開始下雨了。當時間為 t 時,此時雨水導致水池中任意位置的水位為 t 。你可以從一個平臺游向四周相鄰的任意一個平臺,但是前提是此時水位必須同時淹沒這兩個平臺。假定你可以瞬間移動無限距離,也就是默認在方格內部游動是不耗時的。當然,在你游泳的時候你必須待在坐標方格里面。
你從坐標方格的左上平臺 (0,0) 出發。最少耗時多久你才能到達坐標方格的右下平臺 (N-1, N-1)?
示例 1:
輸入: [[0,2],[1,3]]
輸出: 3
解釋:
時間為0時,你位于坐標方格的位置為 (0, 0)。
此時你不能游向任意方向,因為四個相鄰方向平臺的高度都大于當前時間為 0 時的水位。
等時間到達 3 時,你才可以游向平臺 (1, 1). 因為此時的水位是 3,坐標方格中的平臺沒有比水位 3 更高的,所以你可以游向坐標方格中的任意位置
代碼
class Solution {int[] fa;public void init(){for(int i=0;i<fa.length;i++)fa[i]=i;}public int find(int x){if(x!=fa[x])fa[x]=find(fa[x]);return fa[x];}public void union(int x,int y){x=find(x);y=find(y);if(x==y) return;fa[x]=y;}public int swimInWater(int[][] grid) {int n=grid.length;int[][] height=new int[n*n][2];fa=new int[n*n];int[][] dir=new int[][]{{0,1},{1,0},{-1,0},{0,-1}};init();for(int i=0;i<n;i++)//記錄某個水位對于的坐標for(int j=0;j<n;j++){height[grid[i][j]][0]=i;height[grid[i][j]][1]=j;}for(int i=0;i<n*n;i++)
//遍歷所有水位,一旦在某個水位,【0,0】和【n-1,n-1】位置連通,則返回{int cur=height[i][0]*n+height[i][1];for(int[] d:dir)//搜索4個方向{int nextX=height[i][0]+d[0],nextY=height[i][1]+d[1];if(nextX<0||nextX>=n||nextY<0||nextY>=n||grid[nextX][nextY]>i) continue;union(cur,nextX*n+nextY);if(find(0)==find(n*n-1)) return i;}}return -1;}
}