leetCode39 組合總數 回溯去重記錄

2021-10-12 08:45:39 字數 2258 閱讀 9639

目錄

一、題目描述

二、解題思路

三、**實現

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重複被選取。

說明:

示例 1:

輸入:candidates = [2,3,6,7], target = 7,

所求解集為:

[[7],

[2,2,3]

]

示例 2:

輸入:candidates = [2,3,5], target = 8,

所求解集為:

[[2,2,2,2],

[2,3,3],

[3,5]

]

回溯演算法的思路和框架就不寫了,dfs之後回溯即可。

這裡主要想記錄下關於在回溯中去重的問題。這道題要求解集中不能有重複的元素,一種直觀的想法是先通過回溯把所有的結果找出來,然後在考慮要不要放進結果集返回時在通過排序去重。我就是這麼做的……但是這樣做會增加對每乙個結果都要排序的額外操作,影響效率。

如果做過了本題的相似題目216:組合總數3,也許會有啟發。216題中是從數字1-9中去選,且結果不存在重複元素,不含重複組合。如果我們依次按照數字1-9的順序去選擇,並且每次選擇下乙個數時只能從當前數字往後選,那麼就可以在不做任何處理的情況下,做到沒有重複元素也沒有重複組合。

同理這道題也可以這麼操作:先把candidates陣列排好序,然後在選擇數字之後依次往後選,即可滿足題目要求。

ps:在題解區看見了**隨想錄大佬給的思路,跟我上面講的是一樣,小開心一下。另外官方題解給了另一種思路,就是對每乙個數都有選和不選兩個選擇,分別對選和不選進行dfs,但是只對選的那個分支進行回溯。如此一來整個構建過程就被拆分成了乙個類似二叉樹深度遍歷的操作,同樣可以得到結果,且效率高,唉,比不過比不過……

構建過程如下圖(來自力扣官方題解)

把提到的**都貼一遍吧;方便對比學習

//法一:來自官方題解

class solution

if (target == 0)

// 直接跳過

dfs(candidates, target, ans, combine, idx + 1);

// 選擇當前數

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

}vector> combinationsum(vector& candidates, int target)

};//法二:來自**隨想錄

class solution

// 如果 sum + candidates[i] > target 就終止遍歷

for (int i = startindex; i < candidates.size() && sum + candidates[i] <= target; i++)

}public:

vector> combinationsum(vector& candidates, int target)

};//法三:來自渣渣本人。。。

#include using namespace std;

vector> res;

void backtrack(vector& candidates, vector& nums, int target, int sum)

} for (int i = 0; i < candidates.size(); i++) else

break; }}

int main() ;

int target = 9;

combinationsum(candidates, target);

for (auto x : res)

cout << endl;

} return 0;

}

leetcode 39 組合總數(回溯)

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明當我看到這道題目的時候,當我看到要得到所有結果的組合,我二話沒說,立馬開始寫 了,一下是我寫的 ...

leetcode39 組合總數

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...

LeetCode 39 組合總數

給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的數字可以無限制重複被選取。輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3 輸入 candidates...