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.
All costs are positive integers.
Example
Example 1
Input:
costs = [[14,2,11],[11,14,5],[14,3,10]]
Output: 10
Explanation:
The three house use color [1,2,1] for each house. The total cost is 10.
Example 2
Input:
costs = [[5]]
Output: 5
Explanation:
There is only one color and one house.
Challenge
Could you solve it in O(nk)?
public class Solution {
public int minCostII(int[][] costs) {
if(costs.length==0||costs==null)
return 0;
Integer[][] dp = new Integer[costs.length][costs[0].length];
int min = Integer.MAX_VALUE, secondMin = Integer.MAX_VALUE;
int minColor = -1;
for (int i = 0; i < costs[0].length; i++) {
dp[0][i] = costs[0][i];
if (costs[0][i] < min) {
secondMin = min;
min = costs[0][i];
minColor = i;
} else if (costs[0][i] < secondMin)
secondMin = costs[0][i];
}
for (int i = 1; i < costs.length; i++) {
int newMin = Integer.MAX_VALUE, newSecond = Integer.MAX_VALUE;
int newColor = -1;
for (int j = 0; j < costs[i].length; j++) {
// If it is same as previous color(which holds min value)
if (j == minColor)
dp[i][j] = costs[i][j] + secondMin;
else
dp[i][j] = costs[i][j] + min;
if (dp[i][j] < newMin) {
newSecond = newMin;
newMin = dp[i][j];
newColor = j;
} else if (dp[i][j] < newSecond)
newSecond = dp[i][j];
}
min = newMin;
secondMin = newSecond;
minColor = newColor;
}
return min;
}
}
Last updated