返回
融会贯通!最全面的【LeetCode】剑指 Offer II 091. 粉刷房子题解,入门到精通!
后端
2023-11-21 04:59:15
【问题背景】
在一个有 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 是房屋的数量。