p140 数组的子集(leetcode 78)

一:解题思路

方法一递归法:Time:O(2^n),Space:O(n)

方法二迭代法:Time:O(n*2^n),Space:O(1)

二:完整代码示例 (C++版和Java版)

方法一C++:

class Solution 
{
private:
    void sub(vector<int>& nums, int start, vector<int>& elem, vector<vector<int>>& result)
    {
        result.push_back(elem);
        for (int i = start; i < nums.size(); i++)
        {
            elem.push_back(nums[i]);
            sub(nums,i+1,elem,result);
            elem.pop_back();
        }
    }
public:
    vector<vector<int>> subsets(vector<int>& nums) 
    {
        vector<vector<int>> result;
        vector<int> elem;

        sub(nums,0,elem,result);

        return result;
    }
};

方法一Java:

class Solution
    {
        private void sub(int[] nums,int start,List<Integer> elem,List<List<Integer>> result)
        {
                result.add(new ArrayList<>(elem));
                for(int i=start;i<nums.length;i++)
                {
                    elem.add(nums[i]);
                    sub(nums,i+1,elem,result);
                    elem.remove(elem.size()-1);
                }
        }

        public List<List<Integer>> subsets(int[] nums) 
        {
               List<List<Integer>> result=new ArrayList<>();
               List<Integer> elem=new ArrayList<>();
               
               sub(nums,0,elem,result);
               
               return result;
        }
    }

方法二C++:

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) 
    {
        vector<vector<int>> result;
        if (nums.size() == 0) return result;
        int n = nums.size();
        int N = (int)pow(2,n);
        for (int i = 0; i < N; i++)
        {
            vector<int> elem;
            for (int j = 0; j < n; j++)
                if (((i >> j) & 1) == 1)
                    elem.push_back(nums[j]);
            result.push_back(elem);
        }

        return result;
    }
};

方法二Java:

class Solution {
        public List<List<Integer>> subsets(int[] nums)
        {
               List<List<Integer>> result=new ArrayList<>();
               if(nums==null || nums.length==0) return result;
               int n=nums.length;
               int N=(int)Math.pow(2,n);

               for(int i=0;i<N;i++)
               {
                   List<Integer> elem=new ArrayList<>();
                   for(int j=0;j<n;j++)
                   {
                       if(((i>>j)&1)==1)
                           elem.add(nums[j]);
                   }

                   result.add(elem);
               }

               return result;
        }
    }

 

posted @ 2020-04-17 17:52  repinkply  阅读(187)  评论(0)    收藏  举报