Solving Leetcode Interviews in Seconds with AI: Cherry Pickup
Introduction
In this blog post, we will explore how to solve the LeetCode problem "741" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.
Problem Statement
You are given an n x n grid representing a field of cherries, each cell is one of three possible integers. 0 means the cell is empty, so you can pass through, 1 means the cell contains a cherry that you can pick up and pass through, or -1 means the cell contains a thorn that blocks your way. Return the maximum number of cherries you can collect by following the rules below: Starting at the position (0, 0) and reaching (n - 1, n - 1) by moving right or down through valid path cells (cells with value 0 or 1). After reaching (n - 1, n - 1), returning to (0, 0) by moving left or up through valid path cells. When passing through a path cell containing a cherry, you pick it up, and the cell becomes an empty cell 0. If there is no valid path between (0, 0) and (n - 1, n - 1), then no cherries can be collected. Example 1: Input: grid = [[0,1,-1],[1,0,-1],[1,1,1]] Output: 5 Explanation: The player started at (0, 0) and went down, down, right right to reach (2, 2). 4 cherries were picked up during this single trip, and the matrix becomes [[0,1,-1],[0,0,-1],[0,0,0]]. Then, the player went left, up, up, left to return home, picking up one more cherry. The total number of cherries picked up is 5, and this is the maximum possible. Example 2: Input: grid = [[1,1,-1],[1,-1,1],[-1,1,1]] Output: 0 Constraints: n == grid.length n == grid[i].length 1 <= n <= 50 grid[i][j] is -1, 0, or 1. grid[0][0] != -1 grid[n - 1][n - 1] != -1
Explanation
Here's the breakdown of the approach, complexity, and code:
- Dynamic Programming with State Compression: Instead of considering two separate trips, we model two people moving simultaneously from (0,0) to (n-1, n-1). The state
dp[r1][c1][c2]represents the maximum cherries collected when person 1 is at (r1, c1) and person 2 is at (r2, c2). Note thatr1 + c1 == r2 + c2always holds, sor2can be derived. - Avoid Overlapping Paths: When both persons reach the same cell, we add the cherry only once. Handle the case where a cell had a cherry and was picked.
Base Case and Transitions: The base case is dp[0][0][0]. Iterate through possible moves and update
dpto maximize cherry collection.Complexity: O(N^3) time, O(N^3) space, where N is the dimension of the grid.
Code
def cherryPickup(grid):
n = len(grid)
dp = {}
def solve(r1, c1, c2):
r2 = r1 + c1 - c2
if (r1, c1, c2) in dp:
return dp[(r1, c1, c2)]
if r1 == n or c1 == n or r2 == n or c2 == n or \
grid[r1][c1] == -1 or grid[r2][c2] == -1:
return float('-inf')
if r1 == n - 1 and c1 == n - 1:
return grid[r1][c1]
if r2 == n - 1 and c2 == n - 1:
return grid[r1][c1]
cherries = grid[r1][c1]
if r1 != r2 or c1 != c2:
cherries += grid[r2][c2]
ans = max(
solve(r1 + 1, c1, c2 + 1),
solve(r1 + 1, c1, c2),
solve(r1, c1 + 1, c2 + 1),
solve(r1, c1 + 1, c2)
)
dp[(r1, c1, c2)] = cherries + ans
return dp[(r1, c1, c2)]
result = solve(0, 0, 0)
return max(0, result)