返回

融会贯通!最全面的【LeetCode】剑指 Offer II 091. 粉刷房子题解,入门到精通!

后端

【问题背景】

在一个有 n 间房的房屋中,每个房间只能被粉刷成红色、蓝色或绿色。粉刷一个房间的成本取决于所选的颜色。给定一个 n x 3 的矩阵 costs ,其中 costs[i][0] 表示将第 i 间房屋粉刷成红色的成本,costs[i][1] 表示将第 i 间房屋粉刷成蓝色的成本,costs[i][2] 表示将第 i 间房屋粉刷成绿色的成本。你只能使用一种颜色粉刷所有房间。

【解题思路】

1. 动态规划:

我们可以使用动态规划来解决这个问题。我们定义状态 dp[i][j] 表示粉刷前 i 间房屋,最后粉刷的房屋颜色为 j 的最小总成本。我们可以使用以下公式计算状态 dp[i][j]:

dp[i][j] = min(dp[i-1][0], dp[i-1][1], dp[i-1][2]) + costs[i][j]

2. 记忆化搜索:

我们也可以使用记忆化搜索来解决这个问题。我们可以定义一个备忘录 memo,其中 memo[i][j] 表示粉刷前 i 间房屋,最后粉刷的房屋颜色为 j 的最小总成本。当我们计算状态 dp[i][j] 时,我们首先检查 memo[i][j] 是否已经计算过。如果已经计算过,则直接返回 memo[i][j]。否则,我们计算 dp[i][j],并将其存储在 memo[i][j] 中,然后返回 dp[i][j]。

【代码实现】

def minCost(costs):
  """
  :type costs: List[List[int]]
  :rtype: int
  """
  n = len(costs)
  dp = [[0] * 3 for _ in range(n + 1)]

  for i in range(1, n + 1):
    dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + costs[i-1][0]
    dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + costs[i-1][1]
    dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + costs[i-1][2]

  return min(dp[n][0], dp[n][1], dp[n][2])

【复杂度分析】

1. 时间复杂度:

动态规划的复杂度为 O(n * 3),其中 n 是房屋的数量。

记忆化搜索的复杂度为 O(n * 3),其中 n 是房屋的数量。

2. 空间复杂度:

动态规划的空间复杂度为 O(n * 3),其中 n 是房屋的数量。

记忆化搜索的空间复杂度为 O(n * 3),其中 n 是房屋的数量。