跳水板问题
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。
返回的长度需要从小到大排列。
示例 1
输入: shorter = 1 longer = 2 k = 3
输出: [3,4,5,6]
解释: 可以使用 3 次shorter,得到结果 3;使用 2 次 shorter 和 1 次 longer,得到结果 4 。以此类推,得到最终结果。来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/diving-board-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
首先,若k=0,输出空列表,此题无意义;
其次,若shorter=longer,则只需要任意选k块木板即可,那么木板可能的长度只有一种情况,即kshorter或klonger;
第三,若shorter!=longer且k=1,那么有两种选法,一种是选shorter,一种是选longer;
如果前k-1块板已选好,长度为boardlength(k-1),那么最后一块板面临两种选择:
一种是选shorter,boardlength(k)=boardlength(k-1)+shorter;
一种是选longer,boardlength(k)=boardlength(k-1)+longer;
两种方案相差longer-shorter长度,由于k块木板可能的解决方案有k+1中,那么如果第k个方案选择的是shorter,那么第k+1个方案可以在第k个的基础上加上longer-shorter就能算出新的可能长度。由此可得:
递推方程为:f(k)=f(k-1)+longer-shorter
边界条件为:f(0)=k*shorter
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]
boardlenth=[0]*(k+1)
boardlenth[0]=k*shorter
for i in range(1,k+1):
boardlenth[i]=boardlenth[i-1]-shorter+longer
return boardlenth