​​​​​​​跳水板

你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为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 []

解析:

两个特例:

  1. k == 0,这个时候返回 []
  2. 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)

此代码运行效果超过上面的两个!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值