Paint House II(Hard)

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?

解题思路

和I的思路一样,不过这里我们有K个颜色,不能简单的用Math.min方法了。如果遍历一遍颜色数组就找出除了自身外最小的颜色呢?我们只要把最小和次小的都记录下来就行了,这样如果和最小的是一个颜色,就加上次小的开销,反之,则加上最小的开销。

public int minCostII(int[][] costs) {
    if(costs != null && costs.length == 0) return 0;
    int prevMin = 0, prevSec = 0, prevIdx = -1;
    for(int i = 0; i < costs.length; i++){
        int currMin = Integer.MAX_VALUE, currSec = Integer.MAX_VALUE, currIdx = -1;
        for(int j = 0; j < costs[0].length; j++){
            costs[i][j] = costs[i][j] + (prevIdx == j ? prevSec : prevMin);
            // 找出最小和次小的,最小的要记录下标,方便下一轮判断
            if(costs[i][j] < currMin){
                currSec = currMin;
                currMin = costs[i][j];
                currIdx = j;
            } else if (costs[i][j] < currSec){
                currSec = costs[i][j];
            }
        }

        prevMin = currMin;
        prevSec = currSec;
        prevIdx = currIdx;
    }
    return prevMin;
}

References

1 Paint House II

results matching ""

    No results matching ""