边工作边刷题:70天一遍leetcode: day 77
Paint House I/II
要点:这题要区分房子编号i和颜色编号k:目标是某个颜色,所以min的list是上一个房子编号中所有其他颜色+当前颜色的cost
https://repl.it/Chwe/1 (I)
- 善用slicing来eliminate list中一点,还有一点好处是不用考虑超越边界了
II:如何从O(nkk)降到O(n*k)? 每次找到上一个房子编号list的的min这个循环如果在每个k都做一遍,肯定是redundant的。其实loop一遍就能找到对所有颜色k需要的min:min和second_min:second_min用于min对应颜色的上一个房子
错误点:
- 注意不要搞混min/second_min的对象:因为当前颜色的cost是固定的。要min的是上一个房子编号的选择
- list comprehension: if else的优先级低于+,所以+两种可能之一要把if else加括号
- second_smallest的更新:如果smallest变了,第一件事是更新second_smallest,没变则比较second_smallest更新:所以是两处,并注意顺序
https://repl.it/Chxo/2 (II)
错误点:
- 小心k和循环下标混了
- 1d list就能搞定,因为下一个只依赖于前一个
# 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.
# Hide Company Tags LinkedIn
# Hide Tags Dynamic Programming
# Hide Similar Problems (E) House Robber (M) House Robber II (H) Paint House II (E) Paint Fence
class Solution(object):
def minCost(self, costs):
"""
:type costs: List[List[int]]
:rtype: int
"""
prev = [0]*3
for colors in costs:
prev = [colors[i] + min(prev[:i]+prev[i+1:]) for i in xrange(3)]
return min(prev)
sol = Solution()
assert sol.minCost([[1,2,3],[4,5,6],[7,8,9]])==13
# 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?
# Hide Company Tags Facebook
# Hide Tags Dynamic Programming
# Hide Similar Problems (M) Product of Array Except Self (H) Sliding Window Maximum (M) Paint House (E) Paint Fence
class Solution(object):
def minCostII(self, costs):
"""
:type costs: List[List[int]]
:rtype: int
"""
if not costs: return 0
n,k = len(costs), len(costs[0])
prev = [0]*k
for j in xrange(k):
prev[j]=costs[0][j]
for i in xrange(1, n):
minVal, secondMin = float("inf"), float("inf")
minIdx= -1
for j in xrange(k):
if prev[j]<minVal:
secondMin = minVal
minVal, minIdx = prev[j], j
elif prev[j]<secondMin:
secondMin = prev[j]
prev = [costs[i][j] + (minVal if j!=minIdx else secondMin) for j in xrange(k)]
return min(prev)
sol = Solution()
assert sol.minCostII([[1,5,3],[2,9,4]])==5
assert sol.minCostII([[1,2,3],[4,5,6],[7,8,9]])==13
边工作边刷题:70天一遍leetcode: day 77的更多相关文章
- 边工作边刷题:70天一遍leetcode: day 89
Word Break I/II 现在看都是小case题了,一遍过了.注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm) (取决于inner ...
- 边工作边刷题:70天一遍leetcode: day 78
Graph Valid Tree 要点:本身题不难,关键是这题涉及几道关联题目,要清楚之间的差别和关联才能解类似题:isTree就比isCycle多了检查连通性,所以这一系列题从结构上分以下三部分 g ...
- 边工作边刷题:70天一遍leetcode: day 85-3
Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext ...
- 边工作边刷题:70天一遍leetcode: day 101
dp/recursion的方式和是不是game无关,和game本身的规则有关:flip game不累加值,只需要一个boolean就可以.coin in a line II是从一个方向上选取,所以1d ...
- 边工作边刷题:70天一遍leetcode: day 1
(今日完成:Two Sum, Add Two Numbers, Longest Substring Without Repeating Characters, Median of Two Sorted ...
- 边工作边刷题:70天一遍leetcode: day 70
Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phon ...
- 边工作边刷题:70天一遍leetcode: day 71-3
Two Sum I/II/III 要点:都是简单题,III就要注意如果value-num==num的情况,所以要count,并且count>1 https://repl.it/CrZG 错误点: ...
- 边工作边刷题:70天一遍leetcode: day 71-2
One Edit Distance 要点:有两种解法要考虑:已知长度和未知长度(比如只给个iterator) 已知长度:最好不要用if/else在最外面分情况,而是loop在外,用err记录misma ...
- 边工作边刷题:70天一遍leetcode: day 71-1
Longest Substring with At Most K Distinct Characters 要点:要搞清楚At Most Two Distinct和Longest Substring W ...
随机推荐
- 【洛谷 p3382】模板-三分法(算法效率)
题目:给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 解法:与二分法枚举中点使区间分成2份不一样,三分法是枚举三分点,再根据题目的情况修 ...
- 【Effective Java】3、避免创建不必要的对象
创建对象的时候,有些变量可以一直保持的时候,可以不必要每次实例化对象的时候都把这些变量初始化一遍,可以使用静态和静态块的方式把这些变量的数据固定下来 package cn.xf.cp.ch02.ite ...
- ahjesus用forever管理nodejs服务
全局安装forever npm install -g forever 查看帮助 forever -h 查看安装位置 whereis forever 编写自己的sh文件 forever -p web文件 ...
- ASP.NET Web API获取Model元数据
using System; using System.Web.Http; using Common; namespace ConsoleApp { internal class Program { p ...
- CSS后代选择器,子选择器和相邻兄弟选择器
平时在代码练习中,经常用到后代选择器,子选择器也会用到,这里做个总结: 1,后代选择器和子选择器区别: ①写法不一样:后代选择器的标识为:空格 如:ul li{width:150px;} [ul和li ...
- SAP中给当前指定的活动用户发系统信息的函数
函数名:TH_POPUP 输入集团.当前在线用户.Message即可
- [leetcode] Reverse Bits
Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (re ...
- 【读书笔记】iOS-UIFont-动态下载系统提供的字体-官方代码
一,工程目录 二,AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOption ...
- animation of android (3)
视图动画,只有view可以使用. 在android3.0以后,属性动画. ValueAnimation 可以记录属性变化的过程,所以他的对象是任何object. 所以ValueAnimation 的真 ...
- 【php】使用phpdbg来调试php程序
PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境 可以在PHP5.4和之上版本中使用.在PHP5.6和之上版本将内部集成 功能 单步调试 灵活的下断点 ...