Subsets II (LeetCode)

Question:

https://oj.leetcode.com/problems/subsets-ii/

 

跟Subsets I一样,只不过多了判断重复的步骤。如果k和K+1是相同的,则K添加到K之前set生成的新set,与K+1添加到K之前的set生成的新set是一样的,所以对于K+1来说,只需要添加到与K之后生成的新set即可。

 

另外一种方法就是DFS,对于当前的list来说,可以加上之后的任何一个数,形成新的list。比如从i+1到n.只是要注意的是处理完第i+1的数后,要把list恢复成处理i+1之前的样子。

class Solution {
public:
    vector<vector<int> > subsetsWithDup(vector<int> &S) {
        
        vector<vector<int>> result;
        std::sort(S.begin(), S.end());
/*       
        result.push_back(vector<int>());
        int newAdded = 1;
        
        for (int i = 0; i < S.size(); i++)
        {
            newAdded = subsetsbacktracking(result, S, i, newAdded);
        }
*/
       // start from -1 to include empty list
        vector<int> list;
        subsetdfs(result, S, list, -1);
 
        return result;
    }
    
    void subsetdfs(vector<vector<int>>& result, vector<int>& S, vector<int>& list, int pos)
    {
        int size = list.size();
        
        if (pos >= 0)
            list.push_back(S[pos]);

        result.push_back(list);

        for (int i = pos+1; i < S.size(); i++)
        {
            if (i != pos+1 && S[i] == S[i-1])
                continue;
            
            subsetdfs(result, S, list, i);
        }
        
        list.erase(list.begin()+size, list.end());
    }
    
    int subsetsbacktracking(vector<vector<int>>& result, vector<int>& S, int k, int newAddedLast)   // may not be backtracking
    {
        int size = result.size();
        int start = 0;
        if (k > 0 && S[k] == S[k-1])
            start = size - newAddedLast;
            
        for (int i = start; i < size; i++)
        {
            vector<int> newList = result[i];
            newList.push_back(S[k]);
            result.push_back(newList);
        }
        
        return (size - start);
    }
};

 

posted @ 2015-01-22 15:45  smileheart  阅读(153)  评论(0)    收藏  举报