程序員面試金典 16.11

Diving Board:求使用k塊長度爲shorterlonger的木板能組成的所有木板長度。

因爲有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());
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章