You are given an n x n integer matrix grid where each value grid[i][j] represents the elevation at that point (i, j).
The rain starts to fall. At time t, the depth of the water everywhere is t. You can swim from a square to another 4-directionally adjacent square if and only if the elevation of both squares individually are at most t. You can swim infinite distances in zero time. Of course, you must stay within the boundaries of the grid during your swim.
Return the least time until you can reach the bottom right square (n - 1, n - 1) if you start at the top left square (0, 0).
Example 1:
Input: grid = [[0,2],[1,3]] Output: 3 Explanation: At time 0, you are in grid location (0, 0). You cannot go anywhere else because 4-directionally adjacent neighbors have a higher elevation than t = 0. You cannot reach point (1, 1) until time 3. When the depth of water is 3, we can swim anywhere inside the grid.
Example 2:
Input: 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]] Output: 16 Explanation: The final route is shown. We need to wait until time 16 so that (0, 0) and (4, 4) are connected.
Constraints:
n == grid.lengthn == grid[i].length1 <= n <= 500 <= grid[i][j] < n2grid[i][j] is unique.This approach uses Dijkstra's algorithm with a priority queue (min-heap) to find the shortest increasing path to the destination. Each cell in the grid can be thought of as a node, with the elevation as the cost of reaching that node. The priority in the queue is determined by the maximum elevation encountered on the path to that cell. We continuously pick the cell with the lowest elevation cost that can be reached, update the costs of its neighbors and repeat the process until we reach the target cell (n-1, n-1).
This solution implements Dijkstra's algorithm with a custom priority queue using a simple array. The array is sorted to always process the cell with the minimal 'time cost'. The priority queue stores nodes represented as a 'Point', defined by its position and the maximum time required to reach that cell. The sorting results in a straightforward simulation of a min-heap while iterating through possible paths to the target node. The algorithm continues until the destination is reached, ensuring the path guarantees the minimum water depth that needs to be overcome.
C++
Java
Python
C#
JavaScript
Time Complexity: O(n^2 log n), due to sorting the priority queue at each step, where n is the side length of the grid.
Space Complexity: O(n^2), to maintain the priority queue and visited array.
This approach leverages binary search in union with a Depth-First Search (optimized traversal) to find the minimal elevation at which it is possible to traverse from the start to the end point. By evaluating the middling water level and checking the feasibility of reaching the destination, the search efficiently pinpoints the boundary condition: the smallest time 't' needed to connect the top-left and bottom-right corners without breaking elevation conditions.
This code applies binary search over time 't', checking for each midpoint, using depth-first search, whether a viable path exists under that water elevation. It captures the minimal usable 't' as its result. It ensures linear evaluation bounding within constraints, searching for thresholds iteratively where it's impossible to continue path exploration.
C++
Java
Python
C#
JavaScript
Time Complexity: O(n^2 log n), where for each of the log n steps in binary search the DFS traverses O(n^2) nodes in the worst case.
Space Complexity: O(n^2), due to the recursive stack and visitation array.
| Approach | Complexity |
|---|---|
| Approach 1: Dijkstra's Algorithm with Min-Heap | Time Complexity: O(n^2 log n), due to sorting the priority queue at each step, where n is the side length of the grid. |
| Approach 2: Binary Search with DFS | Time Complexity: O(n^2 log n), where for each of the log n steps in binary search the DFS traverses O(n^2) nodes in the worst case. |
Swim in Rising Water - Dijkstra's Algorithm - Leetcode 778 - Python • NeetCode • 58,131 views views
Watch 9 more video solutions →Practice Swim in Rising Water with our built-in code editor and test cases.
Practice on FleetCode