大厂面试真题详解:房屋染色

简介: 大厂面试真题详解:房屋染色

这里有n个房子在一列直线上,现在我们需要给房屋染色,分别有红色蓝色和绿色。每个房屋染不同的颜色费用也不同,你需要设计一种染色方案使得相邻的房屋颜色不同,并且费用最小,返回最小的费用。
费用通过一个nx3 的矩阵给出,比如cost0表示房屋0染红色的费用,cost1表示房屋1染绿色的费用。

在线评测地址:领扣题库官网

样例 1:

输入: [[14,2,11],[11,14,5],[14,3,10]]
输出: 10
解释: 第一个屋子染蓝色,第二个染绿色,第三个染蓝色,最小花费:2 + 5 + 3 = 10.

样例 2:

输入: [[1,2,3],[1,4,6]]
输出: 3

算法:动态规划(dp)

算法思路

  • dpi表示第i幢房子涂j的颜色最小的花费总和,即从前一幢房子的状态dp[i-1]k中选一个不同颜色且最小的再加上给第i幢房子涂j颜色的costs。

代码思路

  1. 初始化状态dp0=costs0
  2. 从左往右遍历每一幢房子,计算到该幢房子涂每种颜色的最小花费,状态转移方程是dpi = min{dpi-1 +costsi} (k != j)
  3. 答案为到最后一幢房子涂每种颜色花费中的最小值,即min(dpn-1),k=0,1,2

复杂度分析

N表示房子的幢数,即costs数组长度

  • 空间复杂度:O(1)
  • 时间复杂度:O(N)
    优化
  • 滚动存储状态,可以将空间复杂度从O(N)优化到O(1)。

代码

public class Solution {

    /**
     * @param costs: n x 3 cost matrix
     * @return: An integer, the minimum cost to paint all houses
     */

    public int minCost(int[][] costs) {
        int n = costs.length;
        if (n == 0) {
            return 0;
        }

        //dp[i][j]表示第i幢房子涂j的颜色最小的总和
        //初始化状态dp[0][i]=costs[0][i]

        int[][] dp = new int[2][3];

        for (int i= 0; i < 3; i++) {
            dp[0][i] = costs[0][i];
        }

        for (int i = 1; i < n; i++) {
            for (int j = 0; j < 3; j++) {
                dp[i&1][j] = Integer.MAX_VALUE;
                for (int k = 0; k < 3; k++) {
                    if (k != j) {
                        dp[i&1][j] = Math.min(dp[i&1][j], dp[i&1^1][k] + costs[i][j]);
                    }
                }
            }
        }
        return Math.min(dp[n&1^1][0], Math.min(dp[n&1^1][1], dp[n&1^1][2]) );
    }
}

更多题解参考:九章官网solution

相关文章
|
Serverless C语言 索引
华为面试C语言真题(二)
华为面试C语言真题( 二)
305 1
华为面试C语言真题(二)
|
安全 测试技术 Python
软件测试面试题及答案,这个题库有3千多道最新面试真题可以刷
相信对于很多软件测试新手来说,技术项目的面试是十分让人头疼的,生怕没回答得好,就会跟这个offer失之交臂
205 0
|
设计模式 缓存 算法
腾讯Java高级岗180道面试真题,面试大厂拿45Koffer没问题!
一、数据结构与算法基础 · 说一下几种常见的排序算法和分别的复杂度。 · 用Java写一个冒泡排序算法 · 描述一下链式存储结构。 · 如何遍历一棵二叉树? · 倒排一个LinkedList。 · 用Java写一个递归遍历目录下面的所有文件
|
消息中间件 NoSQL 网络协议
字节跳动三面Java经历,砍下年薪50W的Offer,面试真题整理分享
应广大读者要求,今天开更一些大厂的面经和相关的面试干货,下面这份**最新字节跳动春招面经+笔记**带给大家。
153 0
字节跳动三面Java经历,砍下年薪50W的Offer,面试真题整理分享
|
NoSQL 算法 Dubbo
Java工程师丨面试真题(二)
Java工程师丨面试真题(二)
Java工程师丨面试真题(二)
Java工程师丨面试真题(一)
Java工程师丨面试真题(一)
|
存储 自然语言处理 前端开发
【牛客刷题】大厂真题 | 前端面试篇(一)
【牛客刷题】大厂真题 | 前端面试篇(一)
193 0
|
人工智能 Java 测试技术
【牛客刷题系列】Java工程师 | 百度面试真题(二)
【牛客刷题系列】Java工程师 | 百度面试真题(二)
123 0
|
Java
【大厂真题实战】Java工程师 | 字节面试真题(一)
【大厂真题实战】Java工程师 | 字节面试真题(一)
139 0