LeetCode(40):組合總和 II


Medium!

題目描述:

給定一個數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的每個數字在每個組合中只能使用一次

說明:

  • 所有數字(包括目標數)都是正整數。
  • 解集不能包含重復的組合。 

示例 1:

輸入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集為:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

示例 2:

輸入: candidates = [2,5,2,1,2], target = 5,
所求解集為:
[
  [1,2,2],
  [5]
]

解題思路:

這道題跟之前那道 Combination Sum 組合之和 本質沒有區別,只需要改動一點點即可,之前那道題給定數組中的數字可以重復使用,而這道題不能重復使用,只需要在之前的基礎上修改兩個地方即可,首先在遞歸的for循環里加上if (i > start && num[i] == num[i - 1]) continue; 這樣可以防止res中出現重復項然后將遞歸調用combinationSum2DFS里面的參數換成i+1,這樣就不會重復使用數組中的數字了。

C++解法一:

 1 class Solution {
 2 public:
 3     vector<vector<int> > combinationSum2(vector<int> &num, int target) {
 4         vector<vector<int> > res;
 5         vector<int> out;
 6         sort(num.begin(), num.end());
 7         combinationSum2DFS(num, target, 0, out, res);
 8         return res;
 9     }
10     void combinationSum2DFS(vector<int> &num, int target, int start, vector<int> &out, vector<vector<int> > &res) {
11         if (target < 0) return;
12         else if (target == 0) res.push_back(out);
13         else {
14             for (int i = start; i < num.size(); ++i) {
15                 if (i > start && num[i] == num[i - 1]) continue;
16                 out.push_back(num[i]);
17                 combinationSum2DFS(num, target - num[i], i + 1, out, res);
18                 out.pop_back();
19             }
20         }
21     }
22 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM