Combination Sum II [LeetCode]

Problem description: http://oj.leetcode.com/problems/combination-sum-ii/

Basic idea: use recursive approach, remember to avoid duplicate item.

 1 class Solution {
 2 public:
 3     bool isExist(vector<vector<int> > &combinations, vector<int> &item) {
 4         for(auto com: combinations){
 5             if(com.size() == item.size()){
 6                 int k;
 7                 for(k = 0; k < com.size(); k++){
 8                     if(com[k] != item[k])
 9                         break;
10                 }
11                 if(k == com.size())
12                     return true;
13             }
14         }  
15         return false;
16     }
17     vector<vector<int> > combinationSum2(vector<int> &num, int target) {
18         // Note: The Solution object is instantiated only once and is reused by each test case.
19         vector<vector<int> >  combinations;
20         std::sort(num.begin(), num.end());
21         int is_target_equal_to_num = 0;
22         for(int i = 0; i < num.size(); i ++){
23             if(num[i] == target && !is_target_equal_to_num){
24                 is_target_equal_to_num = 1;
25                 vector<int> combination(1, target);
26                 combinations.push_back(combination);
27             }else if(num[i] > target) {
28                 break;
29             }else {
32 vector<int> sub_num(num.begin() + i + 1, num.end()); 33 vector<vector<int> > sub_combinations = combinationSum2(sub_num, target - num[i]); 34 for (auto item : sub_combinations) { 35 item.insert(item.begin(), num[i]); 36 if(!isExist(combinations, item)) 37 combinations.push_back(item); 38 } 39 } 40 } 41 42 return combinations; 43 } 44 };

 

posted @ 2013-10-26 14:12  假日笛声  阅读(190)  评论(0编辑  收藏  举报