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; } }

浙公网安备 33010602011771号