265. Paint House II
题目:
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?
链接: http://leetcode.com/problems/paint-house-ii/
题解:
是Paint House I的generalized版本。这回颜色不是RGB三种,而是扩展到了K种。正好可以试试在Paint House I中没用上的想法。思路还是使用DP, 这回我们需要维护一个刷当前房子之前所有房子最小的花费min1,以及倒数第二小的花费min2。然后我们再遍历当前房子i所有color的花费,假如这个颜色与之前i-1号房子的颜色相同,我们选择min2,否则选择min1。比较完所有颜色以后我们记录下来当前的curMin1,curMin2以及current color, 更新min1,min2和lastColor,就可以继续计算下一个房子了。
Time Complexity - O(n), Space Complexity - O(1)
public class Solution {
public int minCostII(int[][] costs) {
if(costs == null || costs.length == 0) {
return 0;
}
int min1 = 0, min2 = 0, lastColor = -1;
for(int i = 0; i < costs.length; i++) {
int curMin1 = Integer.MAX_VALUE, curMin2 = Integer.MAX_VALUE, curColor = -1;
for(int j = 0; j < costs[0].length; j++) { // loop through all colors
int cost = costs[i][j] + (j == lastColor ? min2 : min1);
if(cost < curMin1) {
curMin2 = curMin1;
curColor = j;
curMin1 = cost;
} else if(cost < curMin2) {
curMin2 = cost;
}
}
min1 = curMin1;
min2 = curMin2;
lastColor = curColor;
}
return min1;
}
}
二刷:
方法跟一刷一样。
主要就是保存一个min,一个secondMin,以及刷上次房子所用的颜色lastColor。 在遍历整个数组的过程中,通过比较不断尝试更新min和secondMin,最后返回结果min.
这里要注意的是,在遍历时,当前颜色等于上次刷房颜色时,我们当前的cost是 cost[j] + secondMinCost,即使用不同的两种颜色。而不同颜色的时候,我们直接使用cost[j] + minCost就可以了。
也就是在数组里找到最小和次小两个元素,以及他们的坐标,然后跟之前保存下来的minCost和secondMinCost以及lastColor进行组合判断。
有些操作还是多余,下次希望可以进一步简化。
Java:
public class Solution {
public int minCostII(int[][] costs) {
if (costs == null || costs.length == 0) return 0;
int minCost = 0, secondMinCost = 0, lastColor = -1;
for (int[] cost : costs) {
int curMin = Integer.MAX_VALUE, curSecondMin = Integer.MAX_VALUE, curColor = -1;
for (int j = 0; j < cost.length; j++) {
int curCost = cost[j] + (j == lastColor ? secondMinCost : minCost);
if (curCost < curMin) {
curSecondMin = curMin;
curMin = curCost;
curColor = j;
} else if (curCost < curSecondMin) {
curSecondMin = curCost;
}
}
minCost = curMin;
secondMinCost = curSecondMin;
lastColor = curColor;
}
return minCost;
}
}

Reference:
https://leetcode.com/discuss/71995/easiest-o-1-space-java-solution
https://leetcode.com/discuss/52982/c-dp-time-o-nk-space-o-k
https://leetcode.com/discuss/54415/ac-java-solution-without-extra-space
https://leetcode.com/discuss/54290/accepted-simple-java-o-nk-solution
https://leetcode.com/discuss/60625/fast-dp-java-solution-runtime-o-nk-space-o-1
https://leetcode.com/discuss/68971/5-ms-java-solution-with-o-kn
http://www.cnblogs.com/jcliBlogger/p/4729957.html
https://leetcode.com/discuss/52937/1-line-python-solution-update-to-o-nk
https://www.zhihu.com/question/33113457
265. Paint House II的更多相关文章
- leetcode 198. House Robber 、 213. House Robber II 、337. House Robber III 、256. Paint House(lintcode 515) 、265. Paint House II(lintcode 516) 、276. Paint Fence(lintcode 514)
House Robber:不能相邻,求能获得的最大值 House Robber II:不能相邻且第一个和最后一个不能同时取,求能获得的最大值 House Robber III:二叉树下的不能相邻,求能 ...
- [LeetCode#265] Paint House II
Problem: There are a row of n houses, each house can be painted with one of the k colors. The cost o ...
- [leetcode]265. Paint House II粉刷房子(K色可选)
There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...
- 265. Paint House II 房子涂色K种选择的版本
[抄题]: There are a row of n houses, each house can be painted with one of the k colors. The cost of p ...
- [LeetCode] 265. Paint House II 粉刷房子
There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...
- LC 265. Paint House II
There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...
- [LintCode] Paint House II 粉刷房子之二
There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...
- [LeetCode] Paint House II 粉刷房子之二
There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...
- LeetCode Paint House II
原题链接在这里:https://leetcode.com/problems/paint-house-ii/ 题目: There are a row of n houses, each house ca ...
随机推荐
- ArtJS(原创)
<script> /* 方法目录: [IE7 8 不支持trim()方法的弥补] [ 终止冒泡] [数字千分位] [js运算的替代方法(js3.3/1.1不等于3浮点计算有bug)] [日 ...
- JavaScript深复制
转载:http://blog.csdn.net/wanmingtom/article/details/7988284 这原本是StackOverFlow里的一个提问,看到答案后受益良多,于是翻译一下下 ...
- 安装配置OPENCMS的Replication cluster(从)详细过程
1. 把opencms.war拷贝到tomcat下的webapps目录,启动tomcat服务. 2. 在安装之前,打开解压缩后的war包目录(tomcat启动后会自动把war包解开),删除目录 $ ...
- Oracle窗口函数显示想要的行数
Oracle中支持窗口函数ROW_NUMBER(),其用法和 MSSQLServer2005中相同,比如我们 执行下面的 SQL语句: SELECT * FROM ( SELECT ROW_NUMBE ...
- 项目开发-->身份认证及用户登录模块
1.首先明确的两个问题 如何判断当前申请是由一个已登录用户发起的?如果Request.IsAuthenticated为true,则表示是一个已登录用户. 如何获取当前登录用户的登录名?如果是一个已登录 ...
- zoj 1450 Minimal Circle 最小覆盖圆
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=450 You are to write a program to fi ...
- 【POJ】【1160】Post Office
DP/四边形不等式 邮局,经典的四边形不等式例题! 关于四边形不等式的学习请看 赵爽论文<动态规划加速原理之四边形不等式> 题目总结&题解:http://blog.csdn.net ...
- 响应式设计Responsinator工具推荐
from:http://www.25xt.com/allcode/4066.html 原文推荐了5种,感觉有用的吧就这一种,所以收藏过来. Responsinator工具的好处Responsinato ...
- share干什么的
share到底干什么的 //--------------------打开GameServer,share中加载------------------------- .加载nBodyID //玩家的nBo ...
- TKStudio 4.6IDE Warning: L6310W: Unable to find ARM libraries.
我也遇到了同样的问题.搞了很久,按下面的操解决了 内容转至:http://bbs.zlgmcu.com/dv_rss.asp?s=xh&boardid=43&id=23032& ...