There are a row ofnhouses, each house can be painted with one of thekcolors. 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 anxk
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.
Example:
Input:
[[1,5,3],[2,9,4]]
Output:
5
Explanation:
Paint house 0 into color 0, paint house 1 into color 2. Minimum cost: 1 + 4 = 5;
Or paint house 0 into color 2, paint house 1 into color 0. Minimum cost: 3 + 2 = 5.
Follow up:
Could you solve it inO(nk) runtime?
class Solution {
public int minCostII(int[][] costs) {
if (costs == null || costs.length == 0 || costs[0].length == 0) return 0;
int n = costs.length, m = costs[0].length;
int prevMin = 0, prevMinIndex = -1, prevSecMin = 0;
for (int i = 0; i < n; i++){
int curMin = Integer.MAX_VALUE, curMinIndex = -1, curSecMin = Integer.MAX_VALUE;
for (int j = 0; j < m; j++){
int temp = costs[i][j] + (prevMinIndex == j ? prevSecMin : prevMin);
if (curMinIndex < 0){
curMin = temp;
curMinIndex = j;
}
else if (temp < curMin){
curSecMin = curMin;
curMin = temp;
curMinIndex = j;
}
else if (temp < curSecMin){
curSecMin = temp;
}
}
prevMin = curMin;
prevMinIndex = curMinIndex;
prevSecMin = curSecMin;
}
return prevMin;
}
}