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:
x has fewer than 16 digits, pad it on the left with leading zeros to obtain a 16-digit string.4 × 4 grid 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).row = 0, column = 0), apply the 6 characters of directions in order:
'D' increments the row by 1.'R' increments the column by 1.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 |
(0,0) → (1,0) → (2,0) → (3,0) → (3,1) → (3,2) → (3,3)[0, 0, 0, 0, 0, 0, 8].The grid for x = 9:
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 9 |
[0, 0, 0, 0, 0, 0, 9].The grid for x = 10:
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
[0, 0, 0, 0, 0, 1, 0].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 |
(0,0) → (1,0) → (2,0) → (2,1) → (2,2) → (3,2) → (3,3)[0, 0, 2, 3, 4, 8, 9].The grid for x = 123456790:
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 1 |
| 2 | 3 | 4 | 5 |
| 6 | 7 | 9 | 0 |
[0, 0, 2, 3, 4, 9, 0].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 |
(0,0) → (0,1) → (0,2) → (0,3) → (1,3) → (2,3) → (3,3)[1, 2, 8, 8, 3, 6, 8].
Constraints:
1 <= l <= r <= 9 × 1015directions.length == 6directions consists of exactly three 'D' characters and three 'R' characters.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.
Solutions for this problem are being prepared.
Try solving it yourself| 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 |
Practice Count Good Integers on a Grid Path with our built-in code editor and test cases.
Practice on FleetCodePractice this problem
Open in Editor