Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Paint House III

Updated
4 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "1473" 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

There is a row of m houses in a small city, each house must be painted with one of the n colors (labeled from 1 to n), some houses that have been painted last summer should not be painted again. A neighborhood is a maximal group of continuous houses that are painted with the same color. For example: houses = [1,2,2,3,3,2,1,1] contains 5 neighborhoods [{1}, {2,2}, {3,3}, {2}, {1,1}]. Given an array houses, an m x n matrix cost and an integer target where: houses[i]: is the color of the house i, and 0 if the house is not painted yet. cost[i][j]: is the cost of paint the house i with the color j + 1. Return the minimum cost of painting all the remaining houses in such a way that there are exactly target neighborhoods. If it is not possible, return -1. Example 1: Input: houses = [0,0,0,0,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3 Output: 9 Explanation: Paint houses of this way [1,2,2,1,1] This array contains target = 3 neighborhoods, [{1}, {2,2}, {1,1}]. Cost of paint all houses (1 + 1 + 1 + 1 + 5) = 9. Example 2: Input: houses = [0,2,1,2,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3 Output: 11 Explanation: Some houses are already painted, Paint the houses of this way [2,2,1,2,2] This array contains target = 3 neighborhoods, [{2,2}, {1}, {2,2}]. Cost of paint the first and last house (10 + 1) = 11. Example 3: Input: houses = [3,1,2,3], cost = [[1,1,1],[1,1,1],[1,1,1],[1,1,1]], m = 4, n = 3, target = 3 Output: -1 Explanation: Houses are already painted with a total of 4 neighborhoods [{3},{1},{2},{3}] different of target = 3. Constraints: m == houses.length == cost.length n == cost[i].length 1 <= m <= 100 1 <= n <= 20 1 <= target <= m 0 <= houses[i] <= n 1 <= cost[i][j] <= 104

Explanation

Here's a solution to the problem, along with explanations:

  • Dynamic Programming: The core idea is to use dynamic programming to explore all possible colorings of the houses while minimizing the cost and achieving the target number of neighborhoods. The DP state will track the house index, the number of neighborhoods formed so far, and the color of the last house.

  • Memoization: To avoid redundant calculations, we'll memoize the results of the DP function.

  • Base Cases and Transitions: The base cases handle the scenarios where we've reached the end of the row of houses. The transitions involve either using the existing color (if the house is already painted) or trying all possible colors for the current house and updating the neighborhood count accordingly.

  • Complexity:

    • Time Complexity: O(m * target * n * n), where m is the number of houses, n is the number of colors, and target is the target number of neighborhoods.
    • Space Complexity: O(m * target * n) for the memoization table.

Code

    def min_cost(houses, cost, m, n, target):
    """
    Calculates the minimum cost to paint the houses with exactly 'target' neighborhoods.

    Args:
        houses: A list of integers representing the colors of the houses (0 if not painted).
        cost: A list of lists representing the cost of painting each house with each color.
        m: The number of houses.
        n: The number of colors.
        target: The target number of neighborhoods.

    Returns:
        The minimum cost to paint the houses, or -1 if it's not possible.
    """

    memo = {}  # Memoization table to store results

    def solve(index, neighborhoods, last_color):
        """
        Recursive function to calculate the minimum cost.

        Args:
            index: The current house index.
            neighborhoods: The number of neighborhoods formed so far.
            last_color: The color of the last house painted.

        Returns:
            The minimum cost, or float('inf') if it's not possible.
        """

        if index == m:
            if neighborhoods == target:
                return 0
            else:
                return float('inf')

        if neighborhoods > target:
            return float('inf')

        if (index, neighborhoods, last_color) in memo:
            return memo[(index, neighborhoods, last_color)]

        min_cost_val = float('inf')

        if houses[index] != 0:  # House is already painted
            new_neighborhoods = neighborhoods + (1 if houses[index] != last_color else 0)
            min_cost_val = solve(index + 1, new_neighborhoods, houses[index])
        else:  # House needs to be painted
            for color in range(1, n + 1):
                new_neighborhoods = neighborhoods + (1 if color != last_color else 0)
                min_cost_val = min(min_cost_val, cost[index][color - 1] + solve(index + 1, new_neighborhoods, color))

        memo[(index, neighborhoods, last_color)] = min_cost_val
        return min_cost_val

    result = solve(0, 0, 0)  # Start at the first house, 0 neighborhoods, no last color

    if result == float('inf'):
        return -1
    else:
        return result

More from this blog

C

Chatmagic blog

2894 posts