1、题目描述
https://leetcode-cn.com/problems/diving-board-lcci/
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。
你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。 返回的长度需要从小到大排列。
输入: shorter = 1 longer = 2 k = 3
输出: {3,4,5,6}
2、代码详解
需要O(n)的时间复杂度
数学方法
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]
# 假设取了 k - i 个 shorter 木板,则取了 i 个 longer 木板
# f(i) = shorter * (k - i) + longer * i
# = shorter * k + (longer - shorter) * i
# f(i) 是随着 i 的增长而单调递增的一元线性函数
# i 的取值是 0 <= i <= k,因此 f(i) 必有 k + 1 个不同的取值
res = [0] * (k + 1)
for i in range(k + 1): # i 个 longer 木板, k - i 个 shorter 木板
res[i] = shorter * (k - i) + longer * i
return res
shorter = 1
longer = 2
k = 3
s = Solution()
print(s.divingBoard(shorter, longer, k)) # {3,4,5,6}