Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d6e745a

Browse files
Solved problems
1 parent 9c883b7 commit d6e745a

File tree

2 files changed

+121
-0
lines changed

2 files changed

+121
-0
lines changed

‎README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ My accepted leetcode solutions to some of the common interview problems.
7979
- [Find Peak Element](problems/src/binary_search/FindPeakElement.java) (Medium)
8080
- [Target Sum](problems/src/binary_search/TargetSum.java) (Medium)
8181
- [H-Index II](problems/src/binary_search/HIndexII.java) (Medium)
82+
- [Swim in Rising Water](problems/src/binary_search/SwimInRisingWater.java) (Hard)
8283

8384
#### [Bit Manipulation](problems/src/bit_manipulation)
8485

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package binary_search;
2+
3+
import java.util.HashSet;
4+
import java.util.Objects;
5+
import java.util.Set;
6+
7+
/**
8+
* Created by gouthamvidyapradhan on 07/04/2019
9+
* On an N x N grid, each square grid[i][j] represents the elevation at that point (i,j).
10+
*
11+
* Now rain starts to fall. At time t, the depth of the water everywhere is t. You can swim from a square to another
12+
* 4-directionally adjacent square if and only if the elevation of both squares individually are at most t. You can
13+
* swim infinite distance in zero time. Of course, you must stay within the boundaries of the grid during your swim.
14+
*
15+
* You start at the top left square (0, 0). What is the least time until you can reach the bottom right square (N-1,
16+
* N-1)?
17+
*
18+
* Example 1:
19+
*
20+
* Input: [[0,2],[1,3]]
21+
* Output: 3
22+
* Explanation:
23+
* At time 0, you are in grid location (0, 0).
24+
* You cannot go anywhere else because 4-directionally adjacent neighbors have a higher elevation than t = 0.
25+
*
26+
* You cannot reach point (1, 1) until time 3.
27+
* When the depth of water is 3, we can swim anywhere inside the grid.
28+
* Example 2:
29+
*
30+
* Input: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]
31+
* Output: 16
32+
* Explanation:
33+
* 0 1 2 3 4
34+
* 24 23 22 21 5
35+
* 12 13 14 15 16
36+
* 11 17 18 19 20
37+
* 10 9 8 7 6
38+
*
39+
* The final route is marked in bold.
40+
* We need to wait until time 16 so that (0, 0) and (4, 4) are connected.
41+
* Note:
42+
*
43+
* 2 <= N <= 50.
44+
* grid[i][j] is a permutation of [0, ..., N*N - 1].
45+
*
46+
* Solution: O(N ^ 2 x log N ^ 2)
47+
* Binary search for the possible answers in the range [0 to N * N-1] and dfs through the grid to check if the
48+
* destination is reachable
49+
*/
50+
public class SwimInRisingWater {
51+
52+
private final int[] R = {0, 0, 1, -1};
53+
private final int[] C = {1, -1, 0, 0};
54+
55+
class Pair{
56+
int r, c;
57+
Pair(int r, int c){
58+
this.r = r;
59+
this.c = c;
60+
}
61+
62+
@Override
63+
public boolean equals(Object o) {
64+
if (this == o) return true;
65+
if (!(o instanceof Pair)) return false;
66+
Pair pair = (Pair) o;
67+
return r == pair.r &&
68+
c == pair.c;
69+
}
70+
71+
@Override
72+
public int hashCode() {
73+
return Objects.hash(r, c);
74+
}
75+
}
76+
/**
77+
* Main method
78+
* @param args
79+
*/
80+
public static void main(String[] args) {
81+
int[][] grid = {{0,1,2,3,4},{24,23,22,21,5},{12,13,14,15,16},{11,17,18,19,20},{10,9,8,7,6}};
82+
System.out.println(new SwimInRisingWater().swimInWater(grid));
83+
}
84+
85+
public int swimInWater(int[][] grid) {
86+
int l = 0, h = (grid.length * grid.length);
87+
int ans = 0;
88+
while(l <= h){
89+
int m = l + (h - l) / 2;
90+
Set<Pair> done = new HashSet<>();
91+
if(dfs(grid, 0, 0, done, m)){
92+
ans = m;
93+
h = m - 1;
94+
} else{
95+
l = m + 1;
96+
}
97+
}
98+
return ans;
99+
}
100+
101+
private boolean dfs(int[][] grid, int r, int c, Set<Pair> done, int V){
102+
if(r == grid.length - 1 && c == grid[0].length - 1) return true;
103+
done.add(new Pair(r, c));
104+
for(int i = 0; i < 4; i ++){
105+
int newR = r + R[i];
106+
int newC = c + C[i];
107+
if(newR >= 0 && newR < grid.length && newC >= 0 && newC < grid[0].length){
108+
int childH = Math.max(V, grid[newR][newC]);
109+
int curH = Math.max(V, grid[r][c]);
110+
if(curH == childH){
111+
Pair child = new Pair(newR, newC);
112+
if(!done.contains(child)){
113+
if(dfs(grid, newR, newC, done, V)) return true;
114+
}
115+
}
116+
}
117+
}
118+
return false;
119+
}
120+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /