DEV Community

Abhishek Chaudhary
Abhishek Chaudhary

Posted on

1 1

Path With Minimum Effort

You are a hiker preparing for an upcoming hike. You are given heights, a 2D array of size rows x columns, where heights[row][col] represents the height of cell (row, col). You are situated in the top-left cell, (0, 0), and you hope to travel to the bottom-right cell, (rows-1, columns-1) (i.e., 0-indexed). You can move up, down, left, or right, and you wish to find a route that requires the minimum effort.

A route's effort is the maximum absolute difference in heights between two consecutive cells of the route.

Return the minimum effort required to travel from the top-left cell to the bottom-right cell.

Example 1:

Input: heights = [[1,2,2],[3,8,2],[5,3,5]]
Output: 2
Explanation: The route of [1,3,5,3,5] has a maximum absolute difference of 2 in consecutive cells.
This is better than the route of [1,2,2,2,5], where the maximum absolute difference is 3.

Example 2:

Input: heights = [[1,2,3],[3,8,4],[5,3,5]]
Output: 1
Explanation: The route of [1,2,3,4,5] has a maximum absolute difference of 1 in consecutive cells, which is better than route [1,3,5,3,5].

Example 3:

Input: heights = [[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,2,1],[1,1,1,2,1]]
Output: 0
Explanation: This route does not require any effort.

Constraints:

  • rows == heights.length
  • columns == heights[i].length
  • 1 <= rows, columns <= 100
  • 1 <= heights[i][j] <= 106

SOLUTION:

class Solution:
    def isPossible(self, heights, i, j, m, n, visited, k):
        if (i, j) == (m - 1, n - 1):
            return True
        for (x, y) in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
            if 0 <= x < m and 0 <= y < n and (x, y) not in visited:
                effort = abs(heights[x][y] - heights[i][j])
                if effort <= k:
                    visited.add((x, y))
                    if self.isPossible(heights, x, y, m, n, visited, k):
                        return True
        return False

    def minimumEffortPath(self, heights: List[List[int]]) -> int:
        m = len(heights)
        n = len(heights[0])
        beg = 0
        end = 1
        while not self.isPossible(heights, 0, 0, m, n, {(0, 0)}, end):
            end = end << 1
        while beg <= end:
            mid = (beg + end) // 2
            iscurrpossible = self.isPossible(heights, 0, 0, m, n, {(0, 0)}, mid)
            isprevpossible = self.isPossible(heights, 0, 0, m, n, {(0, 0)}, mid - 1)
            if not isprevpossible and iscurrpossible:
                return mid
            elif beg == end:
                break
            elif not isprevpossible and not iscurrpossible:
                beg = mid + 1
            elif isprevpossible and iscurrpossible:
                end = mid
        return beg
Enter fullscreen mode Exit fullscreen mode

Image of Datadog

The Essential Toolkit for Front-end Developers

Take a user-centric approach to front-end monitoring that evolves alongside increasingly complex frameworks and single-page applications.

Get The Kit

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay