面試題 16.11. 跳水板(數學法)
阿新 • • 發佈:2020-08-13
- 題目描述
你正在使用一堆木板建造跳水板。有兩種型別的木板,其中長度較短的木板長度為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