你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter
,长度较长的木板长度为longer
。你必须正好使用k
块木板。编写一个方法,生成跳水板所有可能的长度。
返回的长度需要从小到大排列。
示例 1
输入: shorter = 1 longer = 2 k = 3
输出: [3,4,5,6]
解释: 可以使用 3 次 shorter,得到结果 3;使用 2 次 shorter 和 1 次 longer,得到结果 4 。以此类推,得到最终结果。
示例代码:
class Solution(object):
def divingBoard(self, shorter, longer, k):
"""
:type shorter: int
:type longer: int
:type k: int
:rtype: List[int]
"""
length_list = []
if shorter != longer:
for i in range(0, k+1):
length = longer * i + shorter * (k-i)
length_list.append(length)
return length_list
elif shorter == longer and k != 0:
return [shorter * k]
else:
return []
解析:
两个特例:
k == 0
,这个时候返回[]
shorter == longer
,此时结果中只有一种长度,即shorter * k
示例代码2:
class Solution(object):
def divingBoard(self, shorter, longer, k):
"""
:type shorter: int
:type longer: int
:type k: int
:rtype: List[int]
"""
if k == 0:
return []
if shorter == longer:
return [shorter * k]
shorter_len = shorter * k
longer_len = longer * k
step = longer - shorter
return [i for i in range(shorter_len, longer_len + 1, step)]
通过运行测试,此代码比示例代码1的运行效果好!
示例代码3:
class Solution(object):
def divingBoard(self, shorter, longer, k):
"""
:type shorter: int
:type longer: int
:type k: int
:rtype: List[int]
"""
if k == 0:
return []
if shorter == longer:
return [shorter * k]
res = [shorter * k]
step = longer - shorter
for _ in range(k):
res.append(res[-1] + step)
return res
思路解析:
动态规划:最开始全是短木板(k*shorter),然后每次都把上一次的一个短木板变为长木板。
状态转移方程:res.append(res[-1]+longer-shorter)
此代码运行效果超过上面的两个!