Subsets (LeetCode)

Question:

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

 

解法1:

backtracking。先求前K个字符的vector<vector<int>>组合ListK(假设string是排序好的)

ListK = {v1, v2, v3, v4..., v(2^k)}

则List(K+1) = ListK + {v1+s[k+1], v2+s[k+1], ..., v(2^k)+s[k+1]}

 

解法2:

可以得知N个字符会有2^N种情况,假设N<32,可以用一个int的bit[k]表示s[k]. bit[k]==1表示s[k]存在.

比如 0x01 = {s[0]}, 0x02 = {s[1]}, 0x03 = {s[0,1]}

 

class Solution {
public:
    vector<vector<int> > subsets(vector<int> &S) {
        
        // sort S first
        std::sort(S.begin(), S.end());
        
        vector<vector<int>> result;
/*        
        result.push_back(vector<int>());
        
        for (int i = 0; i < S.size(); i++)
        {
            subsetbacktracking(result, S, i);
        }
 */
        bits(result, S);
        
        return result;
    }
    
    void subsetbacktracking(vector<vector<int>>&result, vector<int>& s, int k)
    {
        int size = result.size();
        for (int i = 0; i < size; i++)
        {
            vector<int> newList = result[i];
            newList.push_back(s[k]);
            result.push_back(newList);
        }
    }
    
    void bits(vector<vector<int>>& result, vector<int>& s)
    {
        int bitsCount = s.size();
        
        // so size is from 0 to pow(2, bitsCount)-1
        
        int count = 1 << bitsCount;
        
        for (int i = 0; i < count; i++)
        {
            result.push_back(ConvertNumberToVector(s, i));
        }
    }
    
    vector<int> ConvertNumberToVector(vector<int>& s, int number)
    {
        vector<int> vec;
        
        int i = 0;
        while (number > 0)
        {
            if (number & 0x01)
            {
                vec.push_back(s[i]);
            }
            
            number >>= 1;
            i++;
        }
        
        return vec;
    }
};

 

posted @ 2015-01-21 15:12  smileheart  阅读(158)  评论(0)    收藏  举报