1. 程式人生 > 實用技巧 >面試題 16.11. 跳水板(數學法)

面試題 16.11. 跳水板(數學法)

  • 題目描述
你正在使用一堆木板建造跳水板。有兩種型別的木板,其中長度較短的木板長度為shorter,長度較長的木板長度為longer。你必須正好使用k塊木板。編寫一個方法,生成跳水板所有可能的長度。

返回的長度需要從小到大排列。

示例 1

輸入:
shorter = 1
longer = 2
k = 3
輸出: [3,4,5,6]
解釋:
可以使用 3 次 shorter,得到結果 3;使用 2 次 shorter 和 1 次 longer,得到結果 4 。以此類推,得到最終結果。
提示:

0 < shorter <= longer
0 <= k <= 100000
  • 求解

這道題很容易推匯出,每次選擇的總長度=i * shorter + (k-i) *longer

並且總共有k + 1種情況。

只需要從[0,k+1]遍歷每種情況,計算結果即可,需要注意下是從小到大排列,當然是首先選擇shorter越大值越小。

但是,我們需要注意一個問題:

為什麼在程式碼中我們先定一個一個有長度的list,而不是每次append,這是因為如果動態從陣列末尾新增元素,會導致陣列擴容,而擴容的時候需要拷貝陣列,因此會消耗時間,所以我覺得這道題的真正考點在這裡。

class Solution:
    def divingBoard(self, shorter: int, longer: int, k: int) -> List[int]:
        
if not k: return [] if shorter == longer: return [k * shorter] res = [0] * (k+1) for i in range(k+1): res[i] = longer * i + shorter * (k-i) return res
a = """
... res = []
... for i in range(1000):
...     res.append(i)
... """

b = """
... res = [0]*1000 ... for i in range(1000): ... res[i]= i ... """ timeit.timeit(a, number=100000) 8.584513308999988 timeit.timeit(b, number=100000) 5.659579414999996