携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
costs.length == ncosts[i].length == 31 <= n <= 1001 <= costs[i][j] <= 20
二、思路分析:
我们拿到本题,读取题目内容要求对一排房子🏠进行粉刷,且每相邻的房子之间颜色要求不一的最少费用进行计算。粉刷的颜色是怎么样的,我们继续审题:
- 这次粉刷的颜色只有三种颜色costs[i].length
- costs[i]代表第i栋房子🏠
- cost[i][0]代表第i栋房子第一种颜色粉刷价格,costs[i][1]第i栋房子第二种颜色的粉刷价格以此类推,每栋房子之间的颜色不能一样
我们了解粉刷房子的规则和数据格式,那么再对第i栋房子选择刷哪一种颜色,是需要排除前面i-1的颜色外,在另外剩余的颜色选择费用较少的那一个,因此我们需要计算出i栋房子选择每一种花费的时对于i-1栋房子的话费情况,然后选择最少哪一个。
- 当第i栋房子选择第一中颜色pink,即花费为costs[i][0]
- 第i-1栋房子则需要在green,blue两种选择花费最少的,min(dp[i-1][1],dp[i-1][2])
- 即一共费用costp = min(dp[i-1][1],dp[i-1][2]) + costs[i][0]
- 当第i栋房子选择第一中颜色green,即花费为costs[i][1]
- 第i-1栋房子则需要在pink,blue两种选择花费最少的,min(dp[i-1][0],dp[i-1][2])
- 即一共费用costp = min(dp[i-1][0],dp[i-1][2]) + costs[i][1]
- 当第i栋房子选择第一中颜色blue,即花费为costs[i][2]
- 第i-1栋房子则需要在pink,green两种选择花费最少的,min(dp[i-1][0],dp[i-1][1])
- 即一共费用costp = min(dp[i-1][0],dp[i-1][1]) + costs[i][2]
规律中我们可以看到每一次费用都是要与前一一次结果有关联的,因此本题需要使用动态规划来实现
- 首先需要初始化三种颜色的费用pink,green,blue都赋值为第0栋costs[0][0],costs[0][1],costs[0][2]
- for循环遍历从第1栋房子开始分吧计算出选择不通颜色的费用
- 每一栋三种颜色费用计算完成后,更新到初始的三个变量,继续下一栋颜色计算
class Solution(object): def minCost(self, costs): """ :type costs: List[List[int]] :rtype: int """ pink = costs[0][0] green = costs[0][1] blue = costs[0][2] for i in range(1,len(costs)): costp = min(green,blue) + costs[i][0] costg = min(pink,blue) + costs[i][1] costb = min(pink,green) + costs[i][2] pink = costp green = costg bule = costb return min(pink,green,blue)
三、总结:
本题是一道关于简单动态规划的题目,需要我们自己推导出每栋颜色选择与前一栋的关系,可以使用初始化变量去记录更新,最后只需要比较定义的三个变量值最小即可,AC提交记录如下:
- 时间复杂度:O(n),n为costs.length的长度
- 空间复杂度:O(1),没有使用额外空间
动态规划的题目,对于菜鸟的我难道UPUP,但不管困难有多大,我们也来跟着大佬们思路学习一下解题思路,以上学习大佬们思路后加上自己理解总结,欢迎大佬们点赞评论,下期见~~