zoukankan      html  css  js  c++  java
  • 【Lintcode】017.Subsets

    题目:

    题解:

    Solution 1 ()

    class Solution {
    public:
        vector<vector<int> > subsets(vector<int> &S) {
            vector<vector<int> > res{{}};
            sort(S.begin(), S.end());
            for (int i = 0; i < S.size(); ++i) {
                int size = res.size();
                for (int j = 0; j < size; ++j) {
                    vector<int> instance = res[j];
                    instance.push_back(S[i]);
                    res.push_back(instance);
                    }
            }
            return res;
        }
    };

    Solution 1.2

    class Solution {
    public:
        vector<vector<int> > subsets(vector<int> &S) {
        vector<vector<int> > res(1, vector<int>());
        sort(S.begin(), S.end());
        
        for (int i = 0; i < S.size(); i++) {
            int n = res.size();
            for (int j = 0; j < n; j++) {
                res.push_back(res[j]);
                res.back().push_back(S[i]);
            }
        }
    
        return res;
        }
    };

    Solution 2 ()

    class Solution {
    public:
        vector<vector<int> > subsets(vector<int> &S) {
            vector<vector<int> > res;
            vector<int> v;
            sort(S.begin(), S.end());
            dfs(res, S, v, 0);
            return res;
        }
        void dfs(vector<vector<int> > &res, vector<int> S, vector<int> &v, int pos) {
            res.push_back(v);
            for (int i = pos; i < S.size(); ++i) {
                v.push_back(S[i]);
                dfs(res, S, v, i + 1);
                v.pop_back();
            }
        }
    };

    Bit Manipulation

    This is the most clever solution that I have seen. The idea is that to give all the possible subsets, we just need to exhaust all the possible combinations of the numbers. And each number has only two possibilities: either in or not in a subset. And this can be represented using a bit.

    There is also another a way to visualize this idea. That is, if we use the above example, 1 appears once in every two consecutive subsets, 2 appears twice in every four consecutive subsets, and 3 appears four times in every eight subsets, shown in the following (initially the 8 subsets are all empty):

    [], [], [], [], [], [], [], []

    [], [1], [], [1], [], [1], [], [1]

    [], [1], [2], [1, 2], [], [1], [2], [1, 2]

    [], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]

    Solution 3 ()

    class Solution {
    public:
        vector<vector<int>> subsets(vector<int>& S) {
            sort(S.begin(), S.end());
            int num_subset = pow(2, S.size()); 
            vector<vector<int> > res(num_subset, vector<int>());
    
            for (int i = 0; i < S.size(); i++) {
                for (int j = 0; j < num_subset; j++) {
                    if ((j >> i) & 1) {
                        res[j].push_back(S[i]);
                    }
                }
            }
            return res;  
        }
    };
  • 相关阅读:
    docker 删除本地镜像
    hadoop 伪分布环境部署
    docker多镜像+nginx+django环境部署
    docker+django 运行环境部署
    设计数据结构-LRU缓存算法
    设计数据结构-Unionfind并查集算法
    String#intern理解
    java常见API和集合
    链表总结
    二叉树的基础总结
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6869189.html
Copyright © 2011-2022 走看看