题目:

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. Convert Sorted Array to Binary Search Tree

    Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...

  2. 树的基本操作java版

    看了一下树的定义,一些基本的操作,遍历,获取节点数,获取深度等等..这里参考了西电版的数据结构,基本用的都是递归实现的. 很多说明代码中都有,每个方法我都测了一下,这里我把节点类BTreeNode作为 ...

  3. mysql开机脚本

    #!/bin/bash basedir=/home/app/db/mysql datadir=$basedir/data conf=$basedir/etc/my.cnf pid_file=$data ...

  4. python--str的几个方法

    str.format()  :对应取值 name="chenshan" age=30 address="宜山路926号新思大厦15楼" print " ...

  5. 04.Hibernate一对一关联

        前言:本文主要介绍使用Hibernate映射一对一的关联关系的两种方式:使用外键映射.使用主键映射. 1.数据库表的一对一关联关系     本文根据客户信息表(tb_customer)和地址信 ...

  6. win8 获取管理员权限

    Win8 下动不动 就弹出要管理员权限什么.......   网上找到很多方法.  什么注册表什么..... 不行..   以下这个方法可行. 按WIN+R,运行对话框中输入gpedit.msc,开启 ...

  7. sao/jsp

    sao/i18n/message/ Messages-Client.xml   Messages-Server.xml   sao/wsdl Verification.wsdl   IProcessS ...

  8. URL编码方法比较

    javascript中存在几种对URL字符串进行编码的方法:escape(),encodeURI(),以及encodeURIComponent().这几种编码所起的作用各不相同. escape() 方 ...

  9. 正确使用HTML title属性

    如果你想对使用手机,平板电脑和辅助技术的用户隐藏某些内容,而只对键盘用户显示,那么请使用title属性. 细节 HTML的title属性本身有问题.之所以有问题是因为它在一些重要的方面表现的不够好,尽 ...

  10. ISIN编码

    国际证券识别编码(ISIN编码)是由国际标准化组织(ISO)制定的证券编码标准,并在<证券及相关金融工具-国际证券识别编码体系>(ISO6166)中正式发布.ISO6166主要规定了ISI ...