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

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[0].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[0].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>
  • 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) {

    // Write your code here

    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;

    }