Count Good Integers on a Grid Path - Video Solutions
Leetcode 3906 | Count Good Integers on a Grid Path | Leetcode weekly contest 498
Count Good Integers on a Grid Path - Video Solution
Watch 6 video solutions for Count Good Integers on a Grid Path, a hard level problem involving Dynamic Programming. This walkthrough by CodeWithMeGuys has 529 views views. Want to try solving it yourself? Practice on FleetCode or read the detailed text solution.
Problem Statement
You are given two integers l and r, and a string directions consisting of exactly three 'D' characters and three 'R' characters.
For each integer x in the range [l, r] (inclusive), perform the following steps:
- If
xhas fewer than 16 digits, pad it on the left with leading zeros to obtain a 16-digit string. - Place the 16 digits into a
4 × 4grid in row-major order (the first 4 digits form the first row from left to right, the next 4 digits form the second row, and so on). - Starting at the top-left cell (
row = 0,column = 0), apply the 6 characters ofdirectionsin order:'D'increments the row by 1.'R'increments the column by 1.
- Record the sequence of digits visited along the path (including the starting cell), producing a sequence of length 7.
The integer x is considered good if the recorded sequence is non-decreasing.
Return an integer representing the number of good integers in the range [l, r].
Example 1:
Input: l = 8, r = 10, directions = "DDDRRR"
Output: 2
Explanation:
The grid for x = 8:
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 8 |
- Path:
(0,0) → (1,0) → (2,0) → (3,0) → (3,1) → (3,2) → (3,3) - The sequence of digits visited is
[0, 0, 0, 0, 0, 0, 8]. - As the sequence of digits visited is non-decreasing, 8 is a good integer.
The grid for x = 9:
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 9 |
- The sequence of digits visited is
[0, 0, 0, 0, 0, 0, 9]. - As the sequence of digits visited is non-decreasing, 9 is a good integer.
The grid for x = 10:
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
- The sequence of digits visited is
[0, 0, 0, 0, 0, 1, 0]. - As the sequence of digits visited is not non-decreasing, 10 is not a good integer.
- Hence, only 8 and 9 are good, giving a total of 2 good integers in the range.
Example 2:
Input: l = 123456789, r = 123456790, directions = "DDRRDR"
Output: 1
Explanation:
The grid for x = 123456789:
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 1 |
| 2 | 3 | 4 | 5 |
| 6 | 7 | 8 | 9 |
- Path:
(0,0) → (1,0) → (2,0) → (2,1) → (2,2) → (3,2) → (3,3) - The sequence of digits visited is
[0, 0, 2, 3, 4, 8, 9]. - As the sequence of digits visited is non-decreasing, 123456789 is a good integer.
The grid for x = 123456790:
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 1 |
| 2 | 3 | 4 | 5 |
| 6 | 7 | 9 | 0 |
- The sequence of digits visited is
[0, 0, 2, 3, 4, 9, 0]. - As the sequence of digits visited is not non-decreasing, 123456790 is not a good integer.
- Hence, only 123456789 is good, giving a total of 1 good integer in the range.
Example 3:
Input: l = 1288561398769758, r = 1288561398769758, directions = "RRRDDD"
Output: 0
Explanation:
The grid for x = 1288561398769758:
| 1 | 2 | 8 | 8 |
| 5 | 6 | 1 | 3 |
| 9 | 8 | 7 | 6 |
| 9 | 7 | 5 | 8 |
- Path:
(0,0) → (0,1) → (0,2) → (0,3) → (1,3) → (2,3) → (3,3) - The sequence of digits visited is
[1, 2, 8, 8, 3, 6, 8]. - ​​​​​​​As the sequence of digits visited is not non-decreasing, 1288561398769758 is not a good integer.
- No numbers are good, giving a total of 0 good integers in the range.
Constraints:
1 <= l <= r <= 9 × 1015directions.length == 6directionsconsists of exactly three'D'characters and three'R'characters.
Approach Overview
Problem Overview: You move from the top-left to the bottom-right of a grid while forming an integer from the digits along the path. The goal is to count how many paths produce a good integer (usually defined by a divisibility or remainder constraint). Since each step extends the number with a new digit, the solution must efficiently track partial results while exploring grid paths.
Approach 1: Brute Force DFS Enumeration (Exponential Time, O(2^(m+n)) time, O(m+n) space)
The most direct idea is to enumerate every possible path from the top-left to the bottom-right using depth‑first search. While traversing, append the current grid digit to the growing number. When you reach the destination, check if the constructed integer satisfies the "good" condition. This approach is easy to implement but quickly becomes impractical because the number of paths in a grid grows combinatorially.
Approach 2: DFS with Memoization on Remainders (O(m*n*k) time, O(m*n*k) space)
Instead of storing the full integer, track its remainder with respect to the constraint (for example mod k). Each state becomes (row, col, remainder). When you move to the next cell, update the remainder using (remainder * 10 + digit) % k. Memoization avoids recomputing results for the same state. This dramatically reduces the search space because there are only m * n * k possible states.
Approach 3: Bottom-Up Dynamic Programming (O(m*n*k) time, O(m*n*k) space)
A tabulation approach builds results iteratively. Maintain a DP table where dp[i][j][r] represents the number of ways to reach cell (i,j) with remainder r. Transition from the top or left neighbor by updating the remainder after appending the current digit. This avoids recursion overhead and often runs faster in practice. The technique closely follows standard grid traversal patterns seen in dynamic programming and grid problems.
Approach 4: Space Optimized DP (O(m*n*k) time, O(n*k) space)
Because each row only depends on the previous row and the current row’s left neighbor, the 3D DP table can be compressed. Keep rolling arrays for the current and previous rows while still tracking remainder states. This reduces memory usage significantly while preserving the same transition logic used in the standard DP approach. The idea is similar to optimization techniques commonly used in dynamic programming and path counting problems.
Recommended for interviews: Start by describing the brute-force DFS to demonstrate understanding of path enumeration. Then transition to the remainder-based DP state (i, j, remainder). Interviewers typically expect the optimized dynamic programming solution because it reduces exponential exploration to O(m*n*k) by reusing subproblem results.
Complexity Analysis
| Approach | Time | Space | When to Use |
|---|---|---|---|
| Brute Force DFS | O(2^(m+n)) | O(m+n) | Small grids or for explaining the basic path enumeration idea |
| DFS with Memoization | O(m*n*k) | O(m*n*k) | Top-down solution when recursion with caching is easier to reason about |
| Bottom-Up Dynamic Programming | O(m*n*k) | O(m*n*k) | Most common interview solution with clear state transitions |
| Space Optimized DP | O(m*n*k) | O(n*k) | Large grids where memory optimization matters |