博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Paint House II 粉刷房子之二
阅读量:7063 次
发布时间:2019-06-28

本文共 2484 字,大约阅读时间需要 8 分钟。

There are a row of n houses, each house can be painted with one of the k colors. The cost of painting each house with a certain color is different. You have to paint all the houses such that no two adjacent houses have the same color.

The cost of painting each house with a certain color is represented by a n x k cost matrix. For example, costs[0][0] is the cost of painting house 0 with color 0; costs[1][2]is the cost of painting house 1 with color 2, and so on... Find the minimum cost to paint all houses.

Note:

All costs are positive integers.

Follow up:

Could you solve it in O(nk) runtime?

这道题是之前那道的拓展,那道题只让用红绿蓝三种颜色来粉刷房子,而这道题让我们用k种颜色,这道题不能用之前那题的解法,会TLE。这题的解法的思路还是用DP,但是在找不同颜色的最小值不是遍历所有不同颜色,而是用min1和min2来记录之前房子的最小和第二小的花费的颜色,如果当前房子颜色和min1相同,那么我们用min2对应的值计算,反之我们用min1对应的值,这种解法实际上也包含了求次小值的方法,感觉也是一种很棒的解题思路,参见代码如下:

解法一:

class Solution {public:    int minCostII(vector
>& costs) { if (costs.empty() || costs[0].empty()) return 0; vector
> dp = costs; int min1 = -1, min2 = -1; for (int i = 0; i < dp.size(); ++i) { int last1 = min1, last2 = min2; min1 = -1; min2 = -1; for (int j = 0; j < dp[i].size(); ++j) { if (j != last1) { dp[i][j] += last1 < 0 ? 0 : dp[i - 1][last1]; } else { dp[i][j] += last2 < 0 ? 0 : dp[i - 1][last2]; } if (min1 < 0 || dp[i][j] < dp[i][min1]) { min2 = min1; min1 = j; } else if (min2 < 0 || dp[i][j] < dp[i][min2]) { min2 = j; } } } return dp.back()[min1]; }};

下面这种解法不需要建立二维dp数组,直接用三个变量就可以保存需要的信息即可,参见代码如下:

解法二:

class Solution {public:    int minCostII(vector
>& costs) { if (costs.empty() || costs[0].empty()) return 0; int min1 = 0, min2 = 0, idx1 = -1; for (int i = 0; i < costs.size(); ++i) { int m1 = INT_MAX, m2 = m1, id1 = -1; for (int j = 0; j < costs[i].size(); ++j) { int cost = costs[i][j] + (j == idx1 ? min2 : min1); if (cost < m1) { m2 = m1; m1 = cost; id1 = j; } else if (cost < m2) { m2 = cost; } } min1 = m1; min2 = m2; idx1 = id1; } return min1; }};

本文转自博客园Grandyang的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
格式化输出函数:printf 那些事 (C语言)
查看>>
windows CE 6.0编译报BLDDEMO: There were errors building MY283错误解决办法
查看>>
FTP基础知识
查看>>
今天博客开通了
查看>>
web.xml中的*.jsp如果当welcome-file,eclipse在下次跑的时候不自动更新到tomcat中的问题(eclipse可以去死了)...
查看>>
jQuery 选择器
查看>>
NettyIO
查看>>
重写重要的库函数
查看>>
传感器采集数据工程上关心的参数
查看>>
NYOJ176 整数划分(二)
查看>>
Linux下利用script命令录制并回放终端会话
查看>>
spark SQL学习(load和save操作)
查看>>
两小时入门 Docker
查看>>
主从复制延时判断
查看>>
render 和 redirect 的区别
查看>>
Java原子类--框架
查看>>
mysql-5.7.19免安装版的配置方法
查看>>
Spring IoC容器初始化过程学习
查看>>
后缀树
查看>>
layer.js中layer.tips
查看>>