在一个 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;}
}