Diving Board:求使用k
塊長度爲shorter
和longer
的木板能組成的所有木板長度。
因爲有k
塊木板,要做k
次決策,每一次有兩種選擇方法,根據這個思路可以寫一個遞歸程序,時間複雜度爲O(2 ^ k)
,力扣上測試用例[1, 1, 100000]
會超時,代碼就不貼了。
既然超時了,那可以試試記憶化搜索,去掉一些重複計算,如果當前長度和剩餘木板數量出現過,則直接跳過後面的枚舉。我照着書上寫了一遍,上面的例子確實過了,但是測試用例[136, 9225, 959]
的又超時了。
“在考察這道題的複雜度時,可以將這道題抽象爲填充k
塊木板所有長度的數組,數組的長度最長爲k * longer
,木板數量最多爲k
,所以時間複雜度的上限爲O(k * longer * k)
。實際上數組中很多的長度可能是不可達的,如果方案中每種長度的木板數量是相同的,則最終得到的結果也是相同的,因此實際上只有k
種組合的方案,表的大小就是k * k
,時間複雜度爲O(k * k)
”。
書上這段話要有一個前提,就是隻有兩種長度的木板,所以方案總量就是k
,然後直接計算就可以了,也只有使用這種方法時,纔是一道簡單題目。
class Solution {
private:
set<int> sTotal;
public:
vector<int> divingBoard(int shorter, int longer, int k) {
for(int s = 0; s <= k; s++)
{
sTotal.insert(shorter * s + longer * (k - s));
}
sTotal.erase(0);
return vector<int>(sTotal.begin(), sTotal.end());
}
};