• LeetCode_Subsets


    Given a set of distinct integers, S, return all possible subsets.
    
    Note:
    
    Elements in a subset must be in non-descending order.
    The solution set must not contain duplicate subsets.
    For example,
    If S = [1,2,3], a solution is:
    
    [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]
    

      DFS 的简单应用 : 求组合

    class Solution {
    public:
      void  DFS(vector<int> &S, vector<int> &temp,int n, int size,int start)
        {
        
            if(n == size)
            {
                result.push_back(temp);
                return ;
            }
            if(n > size)
                return ;
            
            for(int i = start; i< len ;i++)
            {
                if(flag[i] == false)
                {
                    flag[i] = true;
                    temp.push_back(S[i]);
                    DFS(S, temp, n+1, size,i+1);
                    temp.pop_back();
                    flag[i] = false;
                }
            }
        
        }
        vector<vector<int> > subsets(vector<int> &S) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            result.clear();
            len = S.size();
            flag.resize(len,false);
            vector<int> temp;
            result.push_back(temp) ;
            sort(S.begin(), S.end());
            
            for(int i = 1; i <= len ; i++)
                 DFS(S, temp,0, i,0);
                 
            return result;
        }
    private:
        vector<vector<int> > result ;
        vector<bool> flag;
        int len;
    };

     解释下start,因为组合和排列不同,组合不考虑排序,所以必须给元素进入temp指定一个次序,这个规则定义就是通过start,这样保证temp是有序的,也就保证result中没有重复

    重写后的代码:

    class Solution {
    public:
        void DFS(vector<int> &S, int currentSize, int length, int currentPos, vector<int> &ans)
        {
        
            if(length == currentSize){
            
                res.push_back(ans);
                return;
            }
            for(int i = currentPos; i < S.size(); i++)
            {
                ans.push_back(S[i]);
                DFS(S, currentSize, length + 1, i+1, ans);
                ans.pop_back();
            }
        }
        vector<vector<int> > subsets(vector<int> &S) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            sort(S.begin(), S.end());
            res.clear();
            vector<int> empt;
            res.push_back(empt);
            for(int i = 1; i <= S.size(); i++)
            {
                vector<int> ans;
                DFS(S, i, 0, 0, ans);
            }
            
            return res;
        }
    private:
        vector<vector<int>> res;
    };
  • 相关阅读:
    设计模式之装饰者模式
    每天一点点
    生财有道
    地图的移动和缩放
    钱分割
    位运算
    ref和out
    使用startCoroutine制定倒计时
    静态类和单例类
    Awake和Start
  • 原文地址:https://www.cnblogs.com/graph/p/3216496.html
Copyright © 2020-2023  润新知