题目:

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的更多相关文章

  1. 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:二叉树下的不能相邻,求能 ...

  2. [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 ...

  3. [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 ...

  4. 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 ...

  5. [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 ...

  6. 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 ...

  7. [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 ...

  8. [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 ...

  9. LeetCode Paint House II

    原题链接在这里:https://leetcode.com/problems/paint-house-ii/ 题目: There are a row of n houses, each house ca ...

随机推荐

  1. TF/IDF(term frequency/inverse document frequency)

    TF/IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明. 一. TF/IDF描述单个term与特定document的相 ...

  2. schedule和scheduleAtFixedRate区别

    需求: 由于系统长期运作,各设备之间产生很多信息,一段时间后需要清除数据 考虑方案: 用schedule还是scheduleAtFixedRate,在此比较分析了下这两个的区别 schedule和sc ...

  3. [转载]char * 和char []的区别---之第二篇

    原文地址:http://blog.sina.com.cn/s/blog_74a4593801019keb.html main() { char *p="abc123ABC";//c ...

  4. 深入理解jQuery中live与bind方法的区别

    本篇文章主要是对jQuery中live与bind方法的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 注意如果是通过jq添加的层和对象一定要用live(),用其他的都不起作用 ...

  5. shell编程之环境变量

    在shell编程里我们首先接触到的是环境变量,常用命令说明 1. 使用echo命令查看单个环境变量.例如: echo $PATH 2. 使用env查看所有环境变量.例如: env 3. 使用set查看 ...

  6. 【BZOJ】【3282】Tree

    LCT 喜闻乐见的Link-Cut-Tree…… srO zyf http://www.cnblogs.com/zyfzyf/p/4149109.html 目测我是第222个?………………不要在意这些 ...

  7. MVC 基础知识

    一. MVC架构1.MVC模式是一种严格实现应用程序各部分隔离的架构模式.隔离:分离关注点,松耦合2.模型(Model) 代表着核心的业务逻辑和数据.模型封装了域实体的属性和行为3.视图(View) ...

  8. JS模板引擎 :ArtTemplate (2)

    上一篇初略的介绍了一下javascript中的模板引擎,有兴趣的可以戳 这里 . 这一篇将带着大家一起做一个简易的模板引擎, 上一篇介绍到:模板引擎其实做的就是两件事. 根据一定的规则,解析我们所定义 ...

  9. 从Theano到Lasagne:基于Python的深度学习的框架和库

    从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...

  10. aspx页面生成html

              /// <summary>         /// aspx生成Html         /// </summary>         /// <pa ...