leetcode 778. 水位上升的泳池中游泳(并查集)
在一個(gè) N x N 的坐標(biāo)方格 grid 中,每一個(gè)方格的值 grid[i][j] 表示在位置 (i,j) 的平臺(tái)高度。
現(xiàn)在開(kāi)始下雨了。當(dāng)時(shí)間為 t 時(shí),此時(shí)雨水導(dǎo)致水池中任意位置的水位為 t 。你可以從一個(gè)平臺(tái)游向四周相鄰的任意一個(gè)平臺(tái),但是前提是此時(shí)水位必須同時(shí)淹沒(méi)這兩個(gè)平臺(tái)。假定你可以瞬間移動(dòng)無(wú)限距離,也就是默認(rèn)在方格內(nèi)部游動(dòng)是不耗時(shí)的。當(dāng)然,在你游泳的時(shí)候你必須待在坐標(biāo)方格里面。
你從坐標(biāo)方格的左上平臺(tái) (0,0) 出發(fā)。最少耗時(shí)多久你才能到達(dá)坐標(biāo)方格的右下平臺(tái) (N-1, N-1)?
示例 1:
輸入: [[0,2],[1,3]]
輸出: 3
解釋:
時(shí)間為0時(shí),你位于坐標(biāo)方格的位置為 (0, 0)。
此時(shí)你不能游向任意方向,因?yàn)樗膫€(gè)相鄰方向平臺(tái)的高度都大于當(dāng)前時(shí)間為 0 時(shí)的水位。
等時(shí)間到達(dá) 3 時(shí),你才可以游向平臺(tái) (1, 1). 因?yàn)榇藭r(shí)的水位是 3,坐標(biāo)方格中的平臺(tái)沒(méi)有比水位 3 更高的,所以你可以游向坐標(biāo)方格中的任意位置
代碼
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++)//記錄某個(gè)水位對(duì)于的坐標(biāo)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++) //遍歷所有水位,一旦在某個(gè)水位,【0,0】和【n-1,n-1】位置連通,則返回{int cur=height[i][0]*n+height[i][1];for(int[] d:dir)//搜索4個(gè)方向{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;} }總結(jié)
以上是生活随笔為你收集整理的leetcode 778. 水位上升的泳池中游泳(并查集)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何告诉对方我梦到他了
- 下一篇: 梦到一个人几十次