程式設計訓練第十期 組合總和 II

2021-10-20 02:09:38 字數 1319 閱讀 8323

給定乙個陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。

說明:

1.回溯+剪枝

時間複雜度:o(2^n × n) ,其中 n 是陣列 candidates 的長度。在大部分遞迴 + 回溯的題目中,我們無法給出乙個嚴格的漸進緊界,故這裡只分析乙個較為寬鬆的漸進上界。在最壞的情況下,陣列中的每個數都不相同,那麼列表 freq 的長度同樣為 n。在遞迴時,每個位置可以選或不選,如果陣列中所有數的和不超過 target,那麼 2^n種組合都會被列舉到;在 target 小於陣列中所有數的和時,我們並不能解析地算出滿足題目要求的組合的數量,但我們知道每得到乙個滿足要求的組合,需要 o(n) 的時間將其放入答案中,因此我們將 o(2^n) 與 o(n) 相乘,即可估算出乙個寬鬆的時間複雜度上界。由於 o(2^n × n)在漸進意義下大於排序的時間複雜度 o(n×logn),因此後者可以忽略不計。

空間複雜度:o(n)。除了儲存答案的陣列外,我們需要 o(n) 的空間儲存列表 freq、遞迴中儲存當前選擇的數的列表、以及遞迴需要的棧。

class

solution

if(idx == freq.

size()

|| target < freq[idx]

.first)

//遞迴退出條件2

// 直接跳過

dfs(freq, target, ans, combine, idx +1)

;// 之前組合總和i題目的解法

// if (target - candidates[idx] >= 0)

// 此組合總和ⅱ題目的解法

int temp =

min(target / freq[idx]

.first, freq[idx]

.second)

;for

(int i =

1; i <= temp;

++i)

for(

int i =

1; i <= temp;

++i)

}public

: vectorint>>

combinationsum2

(vector<

int>

& candidates,

int target)

else

}dfs

(freq, target, ans, combine,0)

;return ans;}}

;

FME模板興趣班第十期任務小結

欣欣 今天聖誕節,先祝大家聖誕快樂,隨說是個舶來品,不過過節總是讓人心情愉悅,總歸還是好的 每當這個時候總有人想放假的心情,又是一年年底時,今年,你會給自己做怎樣的總結呢?這期作業一共收到 22份,應該是十一期以來作業數量最多的一次。有很多新手也加入到本次作業大軍中,以後我們出題目的時候盡量能夠交替...

測試開發系列課第十期招生啦

關於霍格沃茲測試學院 為什麼要選擇霍格沃茲 哈佛大學前校長德里克 博克說過的一句話 如果你覺得教育的成本太高,那試試看無知的代價。前段時間oracle的裁員在行業內又掀起了一波中年危機,網際網路的行業特質決定了你想走的更遠,就得讓自己跟上行業發展的速度,淘汰你的從來不是年齡,而是你的專業能力配不上年...

超級計算機研究報告(2023年第十期)

隨著計算技術的發展,科學計算對超級計算機的計算能力提出了越來越高的需求,超級計算機為解決國家經濟建設 科學進步 等一系列重大挑戰性問題提供了不可替代的重要作用。報告目錄 隨著計算技術的發展,科學計算對超級計算機的計算能力提出了越來越高的需求,超級計算機為解決國家經濟建設 科學進步 等一系列重大挑戰性...