給定乙個陣列 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年第十期)
隨著計算技術的發展,科學計算對超級計算機的計算能力提出了越來越高的需求,超級計算機為解決國家經濟建設 科學進步 等一系列重大挑戰性問題提供了不可替代的重要作用。報告目錄 隨著計算技術的發展,科學計算對超級計算機的計算能力提出了越來越高的需求,超級計算機為解決國家經濟建設 科學進步 等一系列重大挑戰性...