# LeetCode – Paint House II (Java)

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 is the cost of painting house 0 with color 0; costs is the cost of painting house 1 with color 2, and so on... Find the minimum cost to paint all houses.

Java Solution

```public int minCostII(int[][] costs) { if(costs==null || costs.length==0) return 0;   int preMin=0; int preSecond=0; int preIndex=-1;   for(int i=0; i<costs.length; i++){ int currMin=Integer.MAX_VALUE; int currSecond = Integer.MAX_VALUE; int currIndex = 0;   for(int j=0; j<costs.length; j++){ if(preIndex==j){ costs[i][j] += preSecond; }else{ costs[i][j] += preMin; }   if(currMin>costs[i][j]){ currSecond = currMin; currMin=costs[i][j]; currIndex = j; } else if(currSecond>costs[i][j] ){ currSecond = costs[i][j]; } }   preMin=currMin; preSecond=currSecond; preIndex =currIndex; }   int result = Integer.MAX_VALUE; for(int j=0; j<costs.length; j++){ if(result>costs[costs.length-1][j]){ result = costs[costs.length-1][j]; } } return result; }```
Category >> Algorithms
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
```<pre><code>
String foo = "bar";
</code></pre>
```
• Satish

Not required as we already find minimum from preMin
``` int result = Integer.MAX_VALUE; for(int j=0; jcosts[costs.length-1][j]){ result = costs[costs.length-1][j]; } } ```

• Omender Sharma

Providing o(n^3) solution here but yea for understanding purpose i think it will be good.

public class Solution {

/**

* @param costs n x k cost matrix

* @return an integer, the minimum cost to paint all houses

*/

public int minCostII(int[][] costs) {

if(costs==null || costs.length==0)

return 0;

for(int i = 1; i < costs.length; i++){

for(int j = 0; j < costs[i].length; j++){

int value = Integer.MAX_VALUE;

for(int k = 0; k < costs[i].length; k++){

if(k == j){

continue;

}

value = Math.min(value, costs[i-1][k]);

}

costs[i][j] += value;

//System.out.println(costs[i][j]);

}

}

int m = costs.length – 1;

int result = Integer.MAX_VALUE;

for(int h = 0; h < costs[m].length; h++){

result = Math.min(result, costs[m][h]);

}

return result;

}