leetcode刷题记录-剑指 Offer II 091. 粉刷房子

113 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

前言

今天的题目为中等,题目的难点在于如果安排算法计算所有的情况,可以使用动态规划合理的对所有的情况进行统计,最后直接得到最合适的那个答案。

每日一题

今天的题目是 剑指 Offer II 091. 粉刷房子,难度为中等

  • 假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。

  • 当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。

  • 例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。

  • 请计算出粉刷完所有房子最少的花费成本。

 

示例 1:

输入: costs = [[17,2,17],[16,16,5],[14,3,19]]
输出: 10
解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。
     最少花费: 2 + 5 + 3 = 10

示例 2:

输入: costs = [[7,6,2]]
输出: 2

 

提示:

  • costs.length == n
  • costs[i].length == 3
  • 1 <= n <= 100
  • 1 <= costs[i][j] <= 20

题解

动态规划

题目需要查找最少的粉刷花费,并且要求粉刷的上下颜色不能相同,那么,可以通过一个个的列举出来,每一个方块所需要的费用。

比如说第二个房子可能会有三种颜色,那么,每一种颜色的最少花费是能够算出来的,比如说红色的话,那么上一个颜色就只能是蓝色或者绿色,那么就能够知道当前房子是红色的时候的最少支出,就是红色的支出加上上一个房子蓝色和绿色的支出少的那一个,那么第二个房子的蓝色和绿色选择的最少支出也能够用这种方式计算出来。

并且对于第三个房子来说,这种方法也同样适用,因为上一个房子也就是第二个房子,它的每一个颜色的支出已经是最少的支出了,那么第三个房子也可以用这种方式算出最少支出,最后只需要返回最后一个房子的三种颜色的最少支出就好了。

function minCost(costs: number[][]): number {
  let len = costs.length
  for (let i = 1; i < len; i++) {
    costs[i][0] += Math.min(costs[i - 1][1], costs[i - 1][2])
    costs[i][1] += Math.min(costs[i - 1][0], costs[i - 1][2])
    costs[i][2] += Math.min(costs[i - 1][0], costs[i - 1][1])
  }
  return Math.min(costs[len - 1][0], Math.min(costs[len - 1][1], costs[len - 1][2]))
};

image.png