zoukankan      html  css  js  c++  java
  • [LeetCode] Paint House I & II

    Paint House

    There are a row of n houses, each house can be painted with one of the three colors: red, blue or green. 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 3 cost matrix. For example, costs[0][0] is the cost of painting house 0 with color red; costs[1][2] is the cost of painting house 1 with color green, and so on... Find the minimum cost to paint all houses.

    Note:
    All costs are positive integers.

     1 class Solution {
     2 public:
     3     int minCost(vector<vector<int>>& costs) {
     4         if (costs.empty()) return 0;
     5         for (int i = 1; i < costs.size(); ++i) {
     6             for (int j = 0; j < 3; ++j) {
     7                 costs[i][j] += min(costs[i-1][(j+1)%3], costs[i-1][(j+2)%3]);
     8             }
     9         }
    10         return min(costs.back()[0], min(costs.back()[1], costs.back()[2]));
    11     }
    12 };

    Paint House II

    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?

     1 class Solution {
     2 public:
     3     int minCostII(vector<vector<int>>& costs) {
     4         if (costs.empty() || costs[0].empty()) return 0;
     5         int n = costs.size(), k = costs[0].size();
     6         vector<int> min1(k), min2(k);
     7         for (int i = 1; i < costs.size(); ++i) {
     8             min1[0] = INT_MAX;
     9             for (int j = 1; j < k; ++j) {
    10                 min1[j] = min(min1[j-1], costs[i-1][j-1]);
    11             }
    12             min2[k-1] = INT_MAX;
    13             for (int j = k - 2; j >= 0; --j) {
    14                 min2[j] = min(min2[j+1], costs[i-1][j+1]);
    15             }
    16             for (int j = 0; j < k; ++j) {
    17                 costs[i][j] += min(min1[j], min2[j]);
    18             }
    19         }
    20         int res = INT_MAX;
    21         for (auto c : costs.back()) {
    22             res = min(res, c);
    23         }
    24         return res;
    25     }
    26 };

    快速找到数组中去掉某个元素的最小值方法:定义两个数组,min1[i]与min2[i]分别记录从左向右到第i位与从右向左到第i位的区间最小值,那么去掉第i位的最小值就是min(min1[i], min2[i])。

  • 相关阅读:
    二叉树知识拓展
    【2014年鄞州区】小幸福(e.pas/c/cpp)
    【2017年常州市】小X与队列 (queue)
    【2018年南海区甲组】扑克游戏(poker)
    【2018年南海区甲组】拆除桥墩(remove)
    【NOIP普及组模拟赛3】投影(skyline)
    常用正则表达式
    asp.net访问母版页控件方法
    C#文件读写操作
    C#读取csv格式文件
  • 原文地址:https://www.cnblogs.com/easonliu/p/4784858.html
Copyright © 2011-2022 走看看