你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。
输入:
shorter = 1
longer = 2
k = 3
输出: {3,4,5,6}
class Solution:
def divingBoard(self, shorter: int, longer: int, k: int) -> List[int]:
return ([shorter * (k - i) + longer * (i) for i in range(k + 1)] if shorter != longer else [shorter * k]) if k > 0 else []
本题真正想考察的方案. 但该方案会超时. - -
class Solution:
def divingBoard(self, shorter: int, longer: int, k: int) -> List[int]:
if k == 0:
return []
if shorter == longer:
return [shorter * k]
res = []
seen = set()
def func(remains, current, count_s, count_l):
if remains == 0:
res.append(current)
return
if (count_s + 1, count_l) not in seen: # 注意剪枝
seen.add((count_s + 1, count_l))
func(remains - 1, current + shorter, count_s + 1, count_l)
if (count_s, count_l + 1) not in seen:
seen.add((count_s, count_l + 1))
func(remains - 1, current + longer, count_s, count_l + 1)
func(k, 0, 0, 0)
return res