LeetCode 题解(260) : Paint House II

本文介绍了一种解决房屋涂色问题的算法,该问题要求在确保相邻房屋颜色不同的前提下,找出涂色所有房屋的最低成本。算法通过动态规划方法,在O(nk)的时间复杂度内找到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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?

题解:

C++版:

class Solution {
public:
    int minCostII(vector<vector<int>>& costs) {
        if(costs.size() == 0)
            return 0;
            
        vector<vector<int>> cost(costs.size(), vector<int>(costs[0].size(), 0));
        for(int i = 0; i < costs[0].size(); i++)
            cost[0][i] = costs[0][i];
            
        int i = 1;
        while(i < costs.size()) {
            int s = INT_MAX;
            pair<int, int> m;
            m.first = 0;
            m.second = INT_MAX;
            for(int j = 0; j < costs[0].size(); j++) {
                if(cost[i-1][j] <= m.second) {
                    s = m.second;
                    m.first = j;
                    m.second = cost[i-1][j];
                } else if(cost[i-1][j] < s) {
                    s = cost[i-1][j];
                }
            }
            for(int j = 0; j < costs[0].size(); j++) {
                int c = 0;
                if(m.second == s) {
                    c = s;
                } else if(j == m.first) {
                    c = s;
                } else {
                    c = m.second;
                }
                cost[i][j] = c + costs[i][j];
            }
            i++;
        }
        int result = INT_MAX;
        for(int k = 0; k < costs[0].size(); k++) {
            if(cost[i-1][k] < result)
                result = cost[i-1][k];
        }
        return result;
    }
};

Python版:

class Solution(object):
    def minCostII(self, costs):
        """
        :type costs: List[List[int]]
        :rtype: int
        """
        if len(costs) == 0:
            return 0

        cost = [[0 for i in range(len(costs[0]))] for j in range(len(costs))]
        for i in range(len(costs[0])):
            cost[0][i] = costs[0][i]

        i = 1
        while i < len(costs):
            minimum, secondMinimum = [0, sys.maxint], sys.maxint
            for j in range(len(costs[0])):
                if cost[i-1][j] <= minimum[1]:
                    secondMinimum = minimum[1]
                    minimum[0] = j
                    minimum[1] = cost[i-1][j]
                elif cost[i-1][j] < secondMinimum:
                    secondMinimum = cost[i-1][j]
            for j in range(len(costs[0])):
                m = 0
                if minimum[1] == secondMinimum:
                    m = minimum[1]
                elif j == minimum[0]:
                    m = secondMinimum
                else:
                    m = minimum[1]
                cost[i][j] = m + costs[i][j]
            i += 1
        result = sys.maxint
        for k in range(len(cost[0])):
            if cost[i-1][k] < result:
                result = cost[i-1][k]
        return result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值